画像を非同期的にダウンロードするための Python asyncio を AI に作成するように依頼しました。
試してみて、画像をダウンロードすることはできますが、保存せずに画像バイナリファイルを直接 JMP テーブルに書き込む方法がわかりません。
専門家の皆さん、ありがとう!
JMP 18 では、画像をテーブルに配置するスクリプトを作成できるのは JSL のみです。
私は以前AIにこのようにJSLを呼び出すように警告していた
jmp.run_jsl = '''
dt = Data Table("ImageTable");
dt[{i + 1}, "Image"] = New Image(Open("{data_url}"));
'''
これを解読しようとしている人のために: 白いテキストは python です。赤いテキストは jsl です。python 形式では、赤い jsl 文字列 (三重引用符で区切られています) の {} が 2 つのパラメータに置き換えられます。base64data は、base64 としてエンコードされた png または jpg ファイルのバイナリ データであり、newimage に必要なものです。
私が驚いたのは、2 つの言語を融合していることだけです。ただし、次の投稿では、lala がほぼ正しい解決策を提案しました。
AIに質問して分析をもらいました:(grok3)
以下は、ダウンロードした画像データを JMP データ テーブルに書き込む処理を処理するコード セグメントの詳細な英語の説明です。
# Write results to JMP data table
for i, (url, image_data) in enumerate(results):
if image_data:
dt["URL"][i] = url
# Encode binary data to base64 and create a Blob object
base64_data = base64.b64encode(image_data).decode('utf-8')
# Create an image object using JSL's CharToBlob
jsl_code = '''
dt = Data Table("ImageTable");
dt[{} , "Image"] = New Image(CharToBlob("{}", "base64"));
'''.format(i + 1, base64_data)
jmp.run_jsl(jsl_code)print("すべての画像が JMP テーブルに書き込まれました!")
行ごとの説明
i、(url、image_data) を enumerate(results) で指定します:
results は、asyncio.gather(*tasks) によって返されるタプルのリストです。各タプルには (url, image_data) が含まれます。
url は画像のソース URL (文字列) です。
image_data はイメージのバイナリ データ (バイト) です。ダウンロードが失敗した場合は None になります。
enumerate(results) は、各タプルにインデックス i (0 から始まる) を提供します。これは、JMP データ テーブル内の行を指定するために使用されます。
この行はすべてのダウンロード結果を反復処理して、有効なデータをテーブルに書き込む準備をします。
image_dataの場合:
image_data が None でないかどうかを確認し、正常にダウンロードされたイメージのみが処理されるようにします。
ダウンロードが失敗した場合 (image_data が None の場合)、ループは次の反復にスキップし、後続のステップでのエラーを回避します。
dt["URL"][i] = URL
dt は、jmp.DataTable("ImageTable") を使用して以前に作成された JMP データ テーブル オブジェクトです。
dt["URL"] は、データ テーブル内の "URL" 列にアクセスします。この列のデータ型は jmp.DataType.Character (文字型) です。
dt["URL"][i]は、URL(画像のソースアドレス)を「URL」列のi行目(0から始まるインデックス)に割り当てます。
このステップでは、JMP Python API を直接使用してセル値を設定し、画像の原点を記録します。
base64_data = base64.b64encode(image_data).decode('utf-8')
base64.b64encode(画像データ):
バイナリ画像データ (image_data、バイト オブジェクト) を base64 形式にエンコードし、バイト文字列を返します。
Base64 は、バイナリ データをテキストベースの環境に適した ASCII 文字列に変換する方法です。
.デコード('utf-8'):
base64 バイト文字列を UTF-8 でエンコードされた文字列にデコードし、プレーンテキストの base64 表現 (例: "iVBORw0KGgo...") を生成します。
このステップでは、バイナリ画像データを JSL が処理できる文字列形式に変換します。
jsl_code = '''...'''
JSL (JMP スクリプト言語) スクリプトを文字列として定義し、画像オブジェクトを作成してデータ テーブルに割り当てます。
スクリプトの内容:
dt = Data Table("ImageTable");
dt[{} , "Image"] = New Image(CharToBlob("{}", "base64"));dt = データテーブル("ImageTable");:
JSL で「ImageTable」データ テーブルを取得し、正しいテーブルがターゲットになっていることを確認します。
dt[{} , "画像"]:
{} は、行番号を表す i + 1 に置き換えられるプレースホルダーです (JSL は 1 から始まるインデックスを使用するため、 i + 1 が使用されます)。
「Image」はターゲット列名を指定します。
新しい画像(CharToBlob("{}", "base64")):
CharToBlob("{}", "base64"):
base64 でエンコードされた文字列 (2 番目の {} で base64_data に置き換えられます) をバイナリ データ (Blob) に変換します。
「base64」は、入力文字列が base64 形式であることを JSL に示します。
新しい画像(...):
JMP の「式」列タイプと互換性のあるバイナリ データからイメージ オブジェクトを作成します。
.format(i + 1, base64_data):
Python の文字列フォーマットを使用して、i + 1 (行番号) と base64_data (base64 文字列) を JSL スクリプトに挿入します。
例: i = 0 かつ base64_data = "iVBORw0KGgo..." の場合、結果の jsl_code は次のようになります。
dt = Data Table("ImageTable");
dt[1 , "Image"] = New Image(CharToBlob("iVBORw0KGgo...", "base64"));
jmp.run_jsl(jsl_code)
jmp.run_jsl は、JSL スクリプトを実行する JMP Python API 関数です。
生成された jsl_code を JMP に渡し、次の処理を実行します。
「ImageTable」データ テーブルの行 i + 1 の「Image」列に画像オブジェクトを挿入します。
画像オブジェクトは base64_data から派生し、JMP で表示可能な画像として表示されます。
print("すべての画像がJMP表格に書き込まれています!")
ループが完了すると、中国語で「すべての画像が JMP テーブルに書き込まれました」というメッセージが出力されます。
これは、操作の完了を確認するための簡単なステータス通知として機能します。
仕組み
データフロー:
結果から各画像の URL と image_data を取得します。
「URL」列に URL を直接書き込みます。
image_data を base64 文字列にエンコードします。
JSL を使用して base64 文字列をイメージ オブジェクトに変換し、「イメージ」列に書き込みます。
主な技術:
asyncio: 非同期画像ダウンロードを処理します。
base64: バイナリ データを文字列にエンコードします。
JSL: CharToBlob と New Image を使用して JMP で画像を処理します。
JMP Python API: jmp.run_jsl を介して Python と JSL を橋渡しします。
注:
画像オブジェクトを保存するには、「Image」列の型は jmp.DataType.Expression である必要があります。
JSL は 1 ベースの行インデックスを使用しますが、Python の enumerate は 0 ベースであるため、i + 1 になります。
エラーを回避するために、image_data が None の場合は処理をスキップします。
潜在的な改善点
エラー処理: JSL 実行エラーをキャッチするために、jmp.run_jsl(jsl_code) の周囲に try-except ブロックを追加します。
パフォーマンス: 画像の数が多い場合は、行ごとの呼び出しではなく、バッチ JSL 実行を実行します。
デバッグ: トラブルシューティングのために base64_data または jsl_code をログに記録します。
このコードは、ディスクに保存せずに、メモリから JMP データ テーブルにイメージ データを正常に書き込みます。
私は何度も Python の asyncio 非同期ダウンロード速度を試しましたが、これは JSL の New Multi HTTP Request() よりもはるかに高速です。