JSLスクリプトに画像を埋め込む時々質問が出て、ブログ記事に値すると思うほど十分な議論が生まれます。今回のJMPの仮想ウォータークーラーに関するディスカッションのトピックは、JSLスクリプト内にイメージを含めるというアイデアです。それほど前の話でも同じような議論が起こり、私にブログ記事を書くように促しました。 JMP 9でグラフに画像を追加する方法 。しかし今回は、最初の質問とその後の議論で、スクリプトが外部のイメージファイルに依存しないように、スクリプトにイメージを埋め込むことについて具体的に質問しました。電子メールスレッドは火曜日に始まり、水曜日に私の受信箱に入ってきました。金曜日までに、私はまだスレッドへのより多くの応答を見ていました。JMPにそれほど関心があるのであれば、私は決定しました。 JMP ユーザーコミュニティ
では、元の画像ファイルが不要になるようにJSLスクリプト内に画像を埋め込むことはできますか?答えは、もちろんです。はい 。皮肉なことに、私が最後のブログ記事を書いていたのと同時に、画像を埋め込むことに関する議論全体が続いていました画像を使用してデータにコンテキストを追加する 。それでは、それが中断したところから始めましょう。
そのブログ記事では、JMPデータテーブルを使用して2変量プロットを作成しました。グラフには風速と風向を示す矢印が含まれています。それからグラフに画像を追加しました。画像はミシガン湖周辺の、風の測定値が記録された地域の地図です。グラフを保存したい場合は、小さな赤い三角形(lrt)を使用して、[スクリプト] - > [スクリプトをスクリプトウィンドウに保存]を選択します。これはグラフ全体を再現するのに必要なJSLを書くでしょう。そうすると、次のようなコードが表示されます。(これは実際のコードの一部にすぎません。)
画像を追加(
ブロブを設定(
BLOBにChar (
"625799eJM // 9WNs7G2 + 0s6euR1e ... Ix0RcMtzpWCTfj / AXh1fKw = "、
"base64圧縮"
、
"PNG"
、
限界(
左 ( - 90.96 、
右 ( - 84.02 、
上 ( 44.97 、
底 ( 39.04 )
)
、
読んだら JMP 9でグラフに画像を追加する方法これで、[イメージの追加]コマンドがわかります。しかし、その例では、ファイル参照を使用しました。つまり、JSLは外部の画像ファイルに依存していました。この例では、ファイル参照の代わりに、ブロブ 。BLOBは、base64圧縮を使用して圧縮された長い文字列の文字データです。これは、スクリプトの中に画像をピクセルデータとして格納するための最小の方法です。ちなみに、... 文字列の中央にあるのは、文字列の大部分が簡潔にするために削除されていることを示すためです。実際の文字列は、ここで示したものよりはるかに長いです。圧縮された文字データに加えて、画像タイプも書き出されます。これは、スクリプトが読み込まれるときに、JMPがBLOBに格納されている文字データを解釈する方法を知っているためです。これに関して素晴らしいことは、私が欲しいグラフを生成し、それからスクリプトウィンドウにスクリプトを保存を使用してJMPに圧縮文字データを生成させることができるということです。自分でやる方法を考え出す必要はありません。いいね!
この時点で、スクリプトファイルが今どのくらい大きいのか疑問に思うかもしれません。さて、私の場合、画像が埋め込まれていないスクリプトは1 KBです。画像ファイルはPNGファイルで、26 KBです。したがって、2つのファイルを合わせたものは27 KBになります。画像をスクリプトファイルに埋め込んでディスクに保存した場合、スクリプトファイルは34 KBになりました。そのため、画像を含むスクリプトは、2つの個々のファイルを組み合わせたものよりも大きくなります。しかし、私はそれがそれほど大きくないことに驚きました。PNGファイルは、圧縮されたピクセルデータのバイナリファイルです。スクリプトに埋め込まれた画像はASCII文字として書き出されます。それで、私はスクリプトがもっと大きくなると予想しました。異なる画像は異なる結果をもたらすと思います。言い換えれば、あなたの走行距離は変わるかもしれません。
これで私は自分のJSLスクリプトを他の人と共有することができ、そして彼らがJMPでそれを実行するとき、彼らは私のグラフを画像と共に完成するでしょう。そして、彼らはログに画像ファイルが見つからなかったというエラーメッセージを見ることはありません。
私はあなたがこの小さなトリックを楽しんでくれることを願っています、そしていつものように、あなたがどう思うか私に知らせてください。
John Ponteは書きました:ここで示したテクニックは設計されたものです...ジョンポンテ書きました:
ここで示した手法は、JPGやPNGなどの画像を処理するためのものです。しかしMacでは、pdfは画像フォーマットと見なされます。したがって、Open()コマンドを使用して画像をグラフに追加し、pdfを外部画像として指定することで、pdfをBLOBに変換できます。その方法については、上記の「JMP 9でグラフに画像を追加する方法」を参照してください。次に、そのスクリプトをスクリプトウィンドウに保存します。これにより、pdfがBLOBに変換されます。次に、BLOBを画像ソースとして使用して、画像を表示する独自のスクリプトを作成できます。BLOBを取得したら、作成した元のグラフを削除できます。それはブロブとしてpdfを得るためのちょうど方法でした。それは理にかなっていますか?
マークシポローネは書きました:ジョン、それはあなたのために埋め込むことは可能ですか...マークシポロン書きました:
ジョン、
PDFまたはPowerpointファイルをJMPファイル内のどこかに埋め込むことはできますか?私がやりたいことは、ファイルを埋め込んでから、ユーザーがテーブルスクリプトを介してファイルを起動/表示できるようにすることです。アイデアは、「ここをクリックして詳細情報」テーブルスクリプトを追加することです。ユーザーがそれをクリックすると、PDFまたはパワーポイントファイルが起動され、JMPファイルに関するより詳細な情報が表示されます。別のファイルに沿ってドラッグするのは常に面倒なので、埋め込むのが好きです。
ありがとう、Mark Cipollone。
John Ponteは書きました:こんにちは、Amitさん、元に戻すにはあなたが持っている...ジョンポンテ書きました:
こんにちは
元に戻すには、幅と高さが何であるかを知る必要があります。画像には幅と高さがありますが、データテーブルにはいくつかの行と列があります。しかし、列の数は、画像の寸法の1つではなく、固有の変数の数に対応します。あなたが私が以前に与えたコードを使うならば、あなたはオリジナルのイメージから幅と高さを知っています。それでも値がないのに上記のコードからデータテーブルを作成したことがわかっている場合は、X列とY列の両方で最大値を探すことができます。高さ(最大X)。この手法を使用すると、これら2つの列の値に関する仮定がありますが、上記のコードに従ってデータテーブルを作成した場合は、その仮定が当てはまることがわかります。
そのため、そのことを念頭に置いて、イメージを再作成するためのコードを次に示します。
//リバースプロセス - データテーブルから画像を再作成します
// 3つの行列を作成する(ピクセルカラー用)
r2 = J(numRows、numCols)。
g2 = J(numRows、numCols);
b2 = J(numRows、numCols);
//各ピクセルのr、g、b値を保存する
行ごとに(
r2 [:y、:x] =:R;
g2 [:y、:x] =:G;
b2 [:y、:x] =:B;
;
//新しい画像を保存
img2 = NewImage( "rgb"、{r2、g2、b2});
img2 << saveImage( "C:\ JMP \ images \ newImage.png"、png);
変数の前に '2'を使用していることに注意してください。以前と同じ変数を再利用できますが、私は自分のコードをテストし、それが機能することを確認したいと思いました。同じ変数を再利用すれば、幅と高さを心配したり、行列を再作成したりする必要はありません。実際にはもっと効率的な方法があるかもしれませんが、これが私の頭を悩ませている解決策です。また、画像をPNGとして保存していることにも注目してください。JPGなど、他の形式も使用できます。
ところで - 私のメールアドレスはJohn.Ponte@jmp.comです。
楽しい!
amit bothraは書きました:こんにちはジョン、返事をありがとう。私は持っています... Bothraより書きました:
こんにちはジョン、
返信いただきありがとうございます。もう1つ要求があります。テーブルをイメージに変換する方法 表には、Y、X、R、G、Bの列があります。
あなたは私があなたに連絡をとることができるjmp電子メールを持っていますか?
よろしく、
やめる
ジョンポンテは書いた:こんにちはAmit、これは確かに可能であり、彼女は...ジョンポンテ書きました:
こんにちは
これは確かに可能であり、ここにそれを行うためのJSLがあります。
// JMPに画像を開く/読み込む
img = NewImage( "$ SAMPLE_IMAGES \ tile.jpg");
//色の値を3つの異なる行列として取得する
{r、g、b} = img << getPixels( "rgb");
//画像/行列の大きさを取得する
numRows = nrow(r);
numCols = ncol(r);
//データテーブルを作成します
dt =新しいテーブル( "ピクセルデータ"、
newColumn( "Y"、値を設定する(shape(repeat(1 :: numRows、numCols) `、numCols、numRows)))、
newColumn( "X"、値の設定(repeat(1 :: numCols、numRows)))、
newColumn( "R"、設定値(r))、
newColumn( "G"、設定値(g))、
newColumn( "B"、設定値(b))、
;
xとyの値は、画像内のピクセル位置です。r、g、およびbの値は、正規化された色空間における各ピクセルの色成分です(0.0〜1.0の値)。最初の行を自分のイメージを参照するように変更するだけで、うまくいくはずです。あなたはまた、データテーブルの名前を変更したいかもしれませんが。
他に質問や幸運がありましたら教えてください。
ジョン
bothraraは、次のように書いています。こんにちはJohn、私はデータセットfrを作成したいのですが... Bothraより書きました:
こんにちはジョン、
X、Y、r、b、gの列を持つ画像からデータセットを作成したいと思います。ここで、XとYは座標、R、GとBは色です。これはJMPで可能ですか。
私の考えは、Kを意味するクラスタを実行することです。私の情報源は http://lamages.blogspot.com/2012/12/now-i-see-it-k-means-cluster-analysis.html#more
よろしく、
やめる
Zoe Jewellは、次のように書いています。私はJMの方法が特に好きです...ゾーイウェル書きました:
とてもきれい!私はJMPが圧縮文字データを生成する方法が特に好きです。