在JSL腳本中嵌入圖像偶爾會出現一個問題,產生足夠的討論,我認為它值得一篇博文。這次圍繞JMP虛擬水冷卻器的討論主題是在JSL腳本中包含圖像的想法。類似的討論不久前出現了,促使我寫了一篇名為的博客文章如何在JMP 9中將圖像添加到圖形 。但這次最初的問題以及隨後的討論,特別詢問瞭如何在腳本中嵌入圖像,以使腳本不依賴於外部圖像文件。一個電子郵件主題在周二開始,並在周三進入我的收件箱。截至週五,我仍然看到更多回複線程。我決定JMP中是否有這麼多的興趣,肯定會有一些興趣 JMP 用戶社區。
那麼你可以在JSL腳本中嵌入一個圖像,以便不再需要原始圖像文件嗎?答案當然是是 。(如果不是我不會寫這篇博文!)具有諷刺意味的是,關於嵌入圖像的整個討論是在我撰寫上一篇博文的同時進行的,使用圖像為數據添加上下文 。那麼讓我們從那個人離開的地方開始吧。
在那篇博文中,我使用JMP數據表來生成雙變量圖。該圖包括顯示風速和風向的箭頭。然後我在圖表中添加了一個圖像。圖像是風力讀數發生地區的地圖 - 密歇根湖周圍。如果我想保存圖形,我可以使用小紅三角(lrt)並選擇腳本 - >將腳本保存到腳本窗口。這將編寫重現整個圖形所必需的JSL。如果我這樣做,我將看到以下代碼。(這只是實際代碼的一部分。)
添加圖片(
設置Blob(
Char To Blob (
“625799eJM // 9WNs7G2 + 0s6euR1e ...... Ix0RcMtzpWCTfj / AXh1fKw =“,
“base64compressed”
)
“PNG”
)
邊界(
剩下 ( - 90.96 )
對 ( - 84.02 )
最佳 ( 44.97 )
底部 ( 39.04 )
)
)
如果你讀如何在JMP 9中將圖像添加到圖形 ,您將識別添加圖像命令。但在該示例中,我使用了文件引用,這意味著JSL依賴於外部圖像文件。在這個例子中,我們使用的是代替文件引用 BLOB 。blob是一長串字符數據,已使用base64壓縮進行壓縮。這是將圖像作為像素數據存儲在腳本中的最小方法。那順便說一句...... 在字符串的中間是為了表明為了簡潔而刪除了大部分字符串。實際的字符串比我在這裡顯示的要長得多。除了壓縮的字符數據外,還會寫出圖像類型。這樣,當讀入腳本時,JMP知道如何解釋存儲在blob中的字符數據。關於這一點的好處是我可以生成我想要的圖形,然後使用“保存腳本到腳本窗口”來讓JMP為我生成壓縮的字符數據。我不必弄清楚如何自己做。太好了!
此時您可能想知道腳本文件現在有多大。好吧,就我而言,沒有嵌入圖像的腳本是1 KB。圖像文件是PNG文件,它是26 KB。所以合併的兩個文件將是27 KB。如果我將圖像嵌入腳本文件並將其保存到磁盤,則腳本文件現在為34 KB。因此包含圖像的腳本比組合的兩個單獨文件大。但是,我不得不承認,我感到驚訝的是它並沒有那麼大。PNG文件是壓縮像素數據的二進製文件。嵌入在腳本中的圖像以ASCII字符形式寫出。所以我希望腳本要大得多。我想不同的圖像會有不同的結果。換句話說,您的里程可能會有所不同。
現在我可以與其他人共享我的JSL腳本,當他們在JMP中運行它們時,他們將看到我的圖表,完成圖像。並且他們不會在日誌中看到錯誤消息,指出無法找到圖像文件。
我希望你喜歡這個小技巧,一如既往,請讓我知道你的想法。
John Ponte寫道:我在這裡展示的技術是......約翰龐特中寫道:
我在這裡展示的技術旨在處理圖像,例如JPG或PNG。但在Mac上,pdf被認為是一種圖像格式。因此,您可以通過使用Open()命令將圖像添加到圖形中來將pdf轉換為blob,並將pdf指定為外部圖像。請參閱上面的“如何在JMP 9中將圖像添加到圖形”,以了解如何執行此操作。然後將該腳本保存到腳本窗口,該窗口將pdf轉換為blob。然後你可以編寫自己的腳本來顯示圖像,使用blob作為圖像源。一旦你有blob,你就可以擺脫你創建的原始圖形。這只是一種將pdf作為blob的方法。那有意義嗎?
mark cipollone寫道:約翰,是否有可能嵌入...標記cipollone 中寫道:
約翰,
是否可以在某個JMP文件中嵌入PDF或Powerpoint文件?我想要做的是嵌入文件,然後允許用戶通過表腳本啟動/查看文件。我們的想法是添加“點擊此處獲取更多信息”表格腳本。當用戶單擊它時,將啟動PDF或powerpoint文件,這將顯示JMP文件的更詳細信息。我喜歡嵌入它的想法,因為拖動一個單獨的文件總是很亂。
謝謝,Mark Cipollone。
約翰龐特寫道:嗨阿米特,要轉換回你只是...約翰龐特中寫道:
嗨阿米特,
要轉換回來,你只需要知道你的寬度和高度。圖像具有寬度和高度,但數據表具有一定數量的行和列。但列數對應於唯一變量的數量,而不是圖像的其中一個維度。如果您使用我之前給您的代碼,那麼您就知道原始圖像的寬度和高度。如果你還沒有這些值,但是你知道你從上面的代碼中創建了數據表,那麼你可以在X和Y列中查找最大值,這樣就可以得到你的寬度(最大Y)和你的身高(最大X)。使用該技術,假設這兩列中的值,但我們知道如果您根據上面的代碼創建數據表,則假設為真。
因此,考慮到這一點,這裡是重新創建圖像的代碼:
//反向過程 - 從數據表中重新創建圖像
//創建三個矩陣(用於像素顏色)
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寫道:嗨約翰,謝謝你的回复。我有... amit Bothra 中寫道:
你好,約翰,
謝謝回复。我還有一個請求。如何將表格轉換回圖像。該表有以下列:Y,X,R,G,B。
你有一個我可以聯繫到你的jmp電子郵件嗎?
問候,
阿米特
約翰龐特寫道:嗨阿米特,這肯定是可能的,她......約翰龐特中寫道:
嗨阿米特,
這肯定是可能的,這裡是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之間)。只需更改第一行以引用您自己的圖像,您就應該好好去。雖然您可能還想更改數據表的名稱。
如果您有任何其他問題並祝您好運,請告訴我!
約翰
amit bothra寫道:嗨約翰,我想創建一個數據集fr ... amit 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生成壓縮字符數據的方式。