Einbetten von Bildern in JSL-SkriptsHin und wieder entsteht eine Frage, die genug Diskussionen hervorbringt, die meiner Meinung nach einen Blogbeitrag wert sind. Das Thema des virtuellen Wasserkühlers von JMP ist diesmal die Idee, ein Bild in ein JSL-Skript aufzunehmen. Eine ähnliche Diskussion entstand vor nicht allzu langer Zeit und veranlasste mich, einen Blogeintrag zu schreiben So fügen Sie einem Diagramm in JMP ein Bild hinzu 9 . Diesmal wurden jedoch die ursprüngliche Frage und die anschließende Diskussion nach dem Einbetten des Bildes in das Skript gefragt, sodass das Skript nicht von einer externen Bilddatei abhängig ist. Ein E-Mail-Thread begann am Dienstag und fand am Mittwoch in meinen Posteingang. Bis Freitag sah ich noch mehr Antworten auf den Thread. Ich habe entschieden, wenn es so viel Interesse bei JMP gibt, sicherlich würde es im ganzen Land ein gewisses Interesse geben JMP Benutzergemeinschaft.
Können Sie also ein Bild in ein JSL-Skript einbetten, sodass die Originalbilddatei nicht mehr benötigt wird? Die Antwort ist natürlich Ja . (Wenn dies nicht der Fall wäre, würde ich diesen Blogeintrag nicht schreiben!) Ironischerweise wurde die ganze Diskussion über das Einbetten von Bildern zur gleichen Zeit fortgesetzt, als ich meinen letzten Blogeintrag schrieb. Verwenden von Bildern zum Hinzufügen von Kontext zu Ihren Daten . Also fangen wir dort an, wo das aufgehört hat.
In diesem Blogpost habe ich eine JMP-Datentabelle verwendet, um eine bivariate Darstellung zu erstellen. Das Diagramm enthielt Pfeile, die die Windgeschwindigkeit und -richtung anzeigen. Dann fügte ich der Grafik ein Bild hinzu. Das Bild war eine Karte der Gegend, in der die Windmesswerte stattfanden - rund um den Michigansee. Wenn ich das Diagramm speichern wollte, könnte ich das kleine rote Dreieck (lrt) verwenden und Skript-> Skript im Skriptfenster speichern auswählen. Dies würde die erforderliche JSL schreiben, um den gesamten Graphen zu reproduzieren. Wenn ich das tue, sehe ich den folgenden Code. (Dies ist nur ein Teil des eigentlichen Codes.)
Bild hinzufügen(
Blob setzen (
Char zu blob (
"625799eJM // 9WNs7G2 + 0s6euR1e ... Ix0RcMtzpWCTfj / AXh1fKw = ",
"base64compressed"
)
"png"
)
Bounds (
Links (- 90,96 )
Recht (- 84.02 )
oben ( 44,97 )
Unterseite ( 39.04 )
)
)
Wenn du liest So fügen Sie einem Diagramm in JMP ein Bild hinzu 9 , erkennen Sie den Befehl Bild hinzufügen. In diesem Beispiel habe ich jedoch einen Dateiverweis verwendet, was bedeutet, dass die JSL von einer externen Image-Datei abhängig war. In diesem Beispiel verwenden wir anstelle eines Dateiverweises eine Klecks . Der Blob ist eine lange Zeichenfolge mit Zeichendaten, die mit der base64-Komprimierung komprimiert wurde. Dies ist der kleinste Weg, um ein Bild als Pixeldaten in einem Skript zu speichern. Übrigens die ... In der Mitte der Zeichenfolge soll angezeigt werden, dass der Großteil der Zeichenfolge der Kürze halber entfernt wurde. Die eigentliche Zeichenfolge ist viel länger als die hier gezeigte. Neben den komprimierten Zeichendaten wird auch der Bildtyp ausgeschrieben. Dies bedeutet, dass JMP beim Einlesen des Skripts die im Blob gespeicherten Zeichendaten interpretieren kann. Das Schöne daran ist, dass ich den gewünschten Graphen generieren kann und dann "Skript in Skriptfenster speichern" verwenden kann, damit JMP die komprimierten Zeichendaten für mich generiert. Ich muss nicht herausfinden, wie ich es selbst mache. Nett!
An dieser Stelle fragen Sie sich vielleicht, wie groß die Skriptdatei jetzt ist. In meinem Fall ist das Skript ohne eingebettetes Bild 1 KB groß. Die Bilddatei ist eine PNG-Datei und hat eine Größe von 26 KB. Die beiden Dateien zusammen wären also 27 KB. Wenn ich das Bild in die Skriptdatei einbetten und auf der Festplatte speichern, ist die Skriptdatei jetzt 34 KB groß. Das Skript, das das Bild enthält, ist also größer als die beiden einzelnen Dateien zusammen. Aber ich muss zugeben, ich war überrascht, dass es nicht viel größer war. Die PNG-Datei ist eine Binärdatei mit komprimierten Pixeldaten. Das im Skript eingebettete Bild wird als ASCII-Zeichen geschrieben. Ich habe also erwartet, dass das Skript viel größer wird. Ich gehe davon aus, dass unterschiedliche Bilder zu unterschiedlichen Ergebnissen führen werden. Mit anderen Worten, Ihre Laufleistung kann variieren.
Jetzt kann ich mein JSL-Skript mit anderen teilen, und wenn sie in JMP ausgeführt werden, sehen sie mein Diagramm und das Bild. Die Fehlermeldung, dass die Image-Datei nicht gefunden wurde, wird im Protokoll nicht angezeigt.
Ich hoffe, Sie genießen diesen kleinen Trick und lassen Sie mich wie immer wissen, was Sie denken.
John Ponte hat geschrieben: Die Technik, die ich hier gezeigt habe, ist ... John Ponte schrieb:
Die hier gezeigte Technik ist für die Arbeit mit Bildern wie JPG oder PNG konzipiert. Auf dem Mac gilt PDF jedoch als Bildformat. So können Sie das PDF-Dokument in einen Blob konvertieren, indem Sie ein Bild zu einem Diagramm hinzufügen, den Befehl Öffnen () verwenden und das PDF als externes Bild angeben. Informationen dazu finden Sie unter "So fügen Sie ein Bild zu einem Diagramm in JMP 9 hinzu". Speichern Sie dieses Skript dann im Skriptfenster, wodurch die PDF-Datei in einen Blob umgewandelt wird. Dann könnten Sie ein eigenes Skript schreiben, das das Bild anzeigen würde, wobei der Blob als Bildquelle verwendet wird. Sobald Sie den Blob haben, können Sie das ursprüngliche Diagramm, das Sie erstellt haben, entfernen. Es war nur eine Möglichkeit, das PDF als Blob zu erhalten. Ist das sinnvoll?
mark cipollone hat geschrieben: John, kann man eithe einbetten ... Markiere Cipollon schrieb:
John,
Kann man irgendwo eine PDF- oder Powerpoint-Datei in eine JMP-Datei einbetten? Ich möchte die Datei einbetten und dem Benutzer dann erlauben, die Datei über ein Tabellenskript zu starten / anzuzeigen. Die Idee ist, ein Tabellenskript "Hier klicken für weitere Informationen" hinzuzufügen. Wenn ein Benutzer darauf klickt, wird die PDF- oder Powerpoint-Datei gestartet, die detailliertere Informationen für die JMP-Datei enthält. Ich mag die Idee, sie einzubetten, da das Verschieben einer separaten Datei immer unordentlich ist.
Danke, Mark Cipollone.
John Ponte hat geschrieben: Hallo Amit, zurück zu konvertieren musst du einfach ... John Ponte schrieb:
Hi Amit,
Um zurück zu konvertieren, müssen Sie nur wissen, welche Breite und Höhe Sie haben. Ein Bild hat eine Breite und eine Höhe, aber eine Datentabelle hat eine bestimmte Anzahl von Zeilen und Spalten. Die Anzahl der Spalten entspricht jedoch der Anzahl der eindeutigen Variablen, nicht einer der Dimensionen des Bildes. Wenn Sie den Code verwenden, den ich Ihnen zuvor gegeben habe, kennen Sie die Breite und Höhe aus dem Originalbild. Wenn Sie diese Werte nicht immer noch haben, aber Sie wissen, dass Sie die Datentabelle aus dem obigen Code erstellt haben, können Sie in den beiden Spalten X und Y nach dem Maximalwert suchen, der Ihnen Ihre Breite (Maximum Y) und Ihren Wert angibt Höhe (max X). Bei Verwendung dieser Technik gibt es eine Annahme über die Werte in diesen beiden Spalten, aber wir wissen, dass die Annahme richtig ist, wenn Sie die Datentabelle gemäß dem obigen Code erstellt haben.
Hier ist also der Code, um das Bild neu zu erstellen:
// Prozess umkehren - Erstellen Sie das Image aus der Datentabelle neu
// Drei Matrizen erstellen (für Pixelfarben)
r2 = J (numRows, numCols);
g2 = J (numRows, numCols);
b2 = J (numRows, numCols);
// Speichern Sie die Werte für r, g, b für jedes Pixel
Für jede Reihe (
r2 [: y,: x] =: R;
g2 [: y,: x] =: G;
b2 [: y,: x] =: B;
);
// Neues Bild speichern
img2 = NewImage ("rgb", {r2, g2, b2});
img2 << saveImage ("C: \ JMP \ images \ newImage.png", png);
Beachten Sie, dass ich vor den Variablen eine '2' verwende. Sie können einfach die gleichen Variablen wie zuvor wiederverwenden, aber ich wollte meinen Code testen und sicherstellen, dass er funktioniert. Wenn Sie dieselben Variablen wiederverwenden, brauchen Sie sich nicht um Breite und Höhe zu kümmern oder die Matrizen erneut zu erstellen. Es könnte tatsächlich einen effizienteren Weg geben, dies zu tun, aber dies ist die Lösung, die mich vom Kopf getroffen hat. Beachten Sie auch, dass ich das Bild als PNG-Datei speichere. Sie können auch ein anderes Format verwenden, z. B. JPG.
Übrigens - meine E-Mail lautet John.Ponte@jmp.com
Genießen!
amit bothra hat geschrieben: Hallo John, Danke für die Antwort. Ich habe... Amit Bothra schrieb:
Hallo John,
Danke für die Antwort. Ich habe noch eine Bitte. Wie kann ich die Tabelle wieder in ein Bild konvertieren? Die Tabelle enthält folgende Spalten: Y, X, R, G, B.
Haben Sie eine jmp-Email, unter der ich Sie erreichen kann?
Grüße,
Amit
John Ponte hat geschrieben: Hallo Amit, das ist sicher möglich und ihr ... John Ponte schrieb:
Hi Amit,
Dies ist sicher möglich und hier ist die JSL, um es zu tun:
// Das Bild in JMP öffnen / lesen
img = NewImage ("$ SAMPLE_IMAGES \ tile.jpg");
// Holen Sie sich die Farbwerte als 3 verschiedene Matrizen
{r, g, b} = img << getPixels ("rgb");
// Ermittle die Dimensionen des Bildes / der Matrizen
numRows = nrow (r);
numCols = ncol (r);
// Erstellen Sie eine Datentabelle
dt = neue Tabelle ("Pixeldaten"),
newColumn ("Y", Werte setzen (Form (Wiederholung (1 :: numRows, numCols) `, numCols, numRows))),
newColumn ("X", Werte setzen (Wiederholung (1 :: numCols, numRows))),
newColumn ("R", Werte setzen (r)),
newColumn ("G", Werte setzen (g)),
newColumn ("B", Werte setzen (b)),
);
Die x- und y-Werte sind die Pixelposition im Bild. Die Werte für r, g und b sind die Farbkomponenten jedes Pixels im normalisierten Farbraum (Werte zwischen 0,0 und 1,0). Ändern Sie einfach die erste Zeile, um auf Ihr eigenes Bild zu verweisen, und Sie sollten in Ordnung sein. Möglicherweise möchten Sie auch den Namen der Datentabelle ändern.
Lassen Sie mich wissen, wenn Sie weitere Fragen haben und viel Glück!
John
amit bothra wrote: Hallo John, ich möchte einen Datensatz für ... Amit Bothra schrieb:
Hallo John,
Ich möchte einen Datensatz aus einem Bild mit folgenden Spalten erstellen: X, Y, r, b, g wobei X und Y Koordinaten sind und R, G und B die Farben sind. Ist das in JMP möglich?
Meine Idee ist, ein K bedeutet Cluster auf ihm auszuführen. Meine Quelle dafür ist http://lamages.blogspot.com/2012/12/now-i-see-it-k-means-cluster-analysis.html#more
Grüße,
Amit
Zoe Jewell hat geschrieben: Sehr ordentlich! Ich mag besonders die Art, wie JM ... Zoe Jewell schrieb:
Sehr gepflegt! Mir gefällt besonders, wie JMP die komprimierten Zeichendaten erzeugen kann.