Incrustar imágenes en scripts JSLDe vez en cuando surge una pregunta que genera una discusión suficiente que creo que es digna de una publicación de blog. El tema de discusión en torno al enfriador de agua virtual de JMP esta vez es la idea de incluir una imagen dentro de un script JSL. Una discusión similar surgió no hace mucho y me instó a escribir una entrada de blog llamada Cómo agregar una imagen a un gráfico en JMP 9 . Pero esta vez, la pregunta inicial y la discusión subsiguiente se preguntaron específicamente acerca de cómo incrustar la imagen en el script, de modo que el script no dependa de un archivo de imagen externo. Un hilo de correo electrónico comenzó el martes, y el miércoles se abrió camino en mi bandeja de entrada. Para el viernes, todavía estaba viendo más respuestas al hilo. Decidí que si había tanto interés dentro de JMP, ciertamente habría algún interés a lo largo del JMP comunidad de usuarios.
Entonces, ¿puede incrustar una imagen dentro de un script JSL para que el archivo de imagen original ya no sea necesario? La respuesta es, por supuesto, sí . (¡Si no fuera así, no estaría escribiendo esta publicación de blog!) Irónicamente, toda la discusión sobre cómo incrustar imágenes tenía lugar al mismo tiempo que escribía mi última publicación de blog, Usando imágenes para agregar contexto a tus datos . Así que vamos a empezar donde lo dejó.
En esa publicación del blog, usé una tabla de datos JMP para generar un gráfico bivariado. La gráfica incluía flechas que mostraban la velocidad y dirección del viento. Luego agregué una imagen al gráfico. La imagen era un mapa del área donde se realizaban las lecturas de viento, alrededor del lago Michigan. Si quisiera guardar el gráfico, podría usar el triángulo rojo pequeño (lrt) y seleccionar Script-> Guardar script en la ventana Script. Esto escribiría el JSL necesario para reproducir el gráfico completo. Si hago eso, veré el siguiente código. (Esto es sólo una parte del código real.)
Añadir imagen(
Establecer Blob (
Char To Blob (
"625799eJM // 9WNs7G2 + 0s6euR1e ... Ix0RcMtzpWCTfj / AXh1fKw = ",
"base64compresado"
)
"png"
)
Límites(
Izquierda (- 90.96 )
Derecha (- 84.02 )
Parte superior ( 44.97 )
Fondo ( 39.04 )
)
)
Si tu lees Cómo agregar una imagen a un gráfico en JMP 9 , reconocerá el comando Agregar imagen. Pero en ese ejemplo, usé una referencia de archivo, lo que significaba que la JSL dependía de un archivo de imagen externo. En este ejemplo, en lugar de una referencia de archivo, estamos utilizando un gota . El blob es una larga cadena de datos de caracteres que se ha comprimido utilizando la compresión base64. Esta es la forma más pequeña de almacenar una imagen como datos de píxeles dentro de un script. Por cierto, el ... en el medio de la cadena se muestra que la mayoría de la cadena de caracteres se ha eliminado por brevedad. La cadena real es mucho más larga de lo que he mostrado aquí. Además de los datos de caracteres comprimidos, también se escribe el tipo de imagen. Esto es para que cuando se lea el script, JMP sepa cómo interpretar los datos de caracteres almacenados en el blob. Lo bueno de esto es que puedo generar el gráfico que quiero y luego usar Save Script to Script Window para que JMP genere los datos de caracteres comprimidos para mí. No tengo que averiguar cómo hacerlo yo mismo. ¡Bonito!
En este punto, es posible que se esté preguntando qué tan grande es el archivo de script ahora. Bueno, en mi caso, el script sin la imagen incrustada es de 1 KB. El archivo de imagen es un archivo PNG y tiene 26 KB. Así que los dos archivos combinados serían 27 KB. Si inserto la imagen en el archivo de script y la guardo en el disco, el archivo de script ahora es de 34 KB. Por lo tanto, el script que contiene la imagen es más grande que los dos archivos individuales combinados. Pero, debo admitir, me sorprendió que no fuera mucho más grande. El archivo PNG es un archivo binario de datos de píxeles comprimidos. La imagen incrustada en el script se escribe como caracteres ASCII. Así que esperaba que el guión fuera mucho más grande. Supongo que diferentes imágenes tendrán diferentes resultados. En otras palabras, su kilometraje puede variar.
Ahora puedo compartir mi script JSL con otros, y cuando lo ejecuten en JMP, verán mi gráfico, completo con la imagen. Y no verán el mensaje de error en el registro que dice que no se pudo encontrar el archivo de imagen.
Espero que disfruten este pequeño truco y, como siempre, háganme saber lo que piensan.
John Ponte escribió: La técnica que mostré aquí está diseñada ... John Ponte escribió:
La técnica que mostré aquí está diseñada para trabajar con imágenes, como JPG o PNG. Pero en la Mac, el pdf es considerado un formato de imagen. Entonces, puede convertir el pdf en un blob agregando una imagen a un gráfico, usando el comando Abrir () y especificando su pdf como la imagen externa. Consulte "Cómo agregar una imagen a un gráfico en JMP 9", más arriba, para ver cómo hacerlo. Luego guarde ese script en la ventana de script, que convertirá el pdf en un blob. Luego, puede escribir su propio script que muestre la imagen, utilizando el blob como fuente de imagen. Una vez que tenga la burbuja, podría deshacerse del gráfico original que creó. Era solo una forma de obtener el pdf como un blob. ¿Tiene sentido?
mark cipollone escribió: John, ¿Es posible incrustar eithe ... marca cipollone escribió:
Juan,
¿Es posible incrustar un archivo PDF o Powerpoint dentro de un archivo JMP en alguna parte? Lo que me gustaría hacer es incrustar el archivo y luego permitir que el usuario inicie / vea el archivo a través de un script de tabla. La idea es agregar una secuencia de comandos "Haga clic aquí para obtener más información". Cuando un usuario hace clic en él, se inicia el archivo PDF o PowerPoint, que presentará información más detallada para el archivo JMP. Me gusta la idea de incrustarlo, ya que arrastrar un archivo separado siempre es complicado.
Gracias, Mark Cipollone.
John Ponte escribió: Hola Amit, Para volver a convertir solo tienes ... John Ponte escribió:
Hola amit
Para volver a convertir solo tienes que saber cuál es tu ancho y altura. Una imagen tiene un ancho y una altura, pero una tabla de datos tiene un número de filas y columnas. Pero el número de columnas corresponde al número de variables únicas, no a una de las dimensiones de la imagen. Si usas el código que te di anteriormente, entonces sabes el ancho y la altura de la imagen original. Si aún no tiene esos valores, pero sabe que creó la tabla de datos a partir del código anterior, puede buscar el valor máximo en las columnas X e Y, y eso le dará su ancho (máximo Y) y su altura (max x). Usando esa técnica, existe una suposición sobre los valores en esas dos columnas, pero sabemos que la suposición es verdadera si creó la tabla de datos según el código anterior.
Entonces, con eso en mente, aquí está el código para recrear la imagen:
// Proceso inverso: volver a crear la imagen de la tabla de datos
// Crear tres matrices (para colores de píxel)
r2 = J (numRows, numCols);
g2 = J (numRows, numCols);
b2 = J (numRows, numCols);
// Guarda los valores r, g, b para cada píxel
por cada fila (
r2 [: y,: x] =: R;
g2 [: y,: x] =: G;
b2 [: y,: x] =: B;
);
// Guardar nueva imagen
img2 = NewImage ("rgb", {r2, g2, b2});
img2 << saveImage ("C: \ JMP \ images \ newImage.png", png);
Note que uso un '2' delante de las variables. Podría reutilizar las mismas variables que antes, pero quería probar mi código y asegurarme de que funcionara. Si reutilizara las mismas variables, no tendría que preocuparse por el ancho y la altura o volver a crear las matrices. En realidad podría haber una forma más eficiente de hacer esto, pero esta es la solución que me sacó de la cabeza. Además, note que guardo la imagen como PNG. También puede utilizar un formato diferente, como JPG.
BTW - mi correo electrónico es John.Ponte@jmp.com
¡Disfrutar!
amit bothra escribió: Hola John, gracias por la respuesta. Yo tengo... amit bothra escribió:
Hola John,
Gracias por la respuesta. Tengo una petición más. ¿Cómo puedo convertir la tabla de nuevo en una imagen. La tabla tiene las siguientes columnas: Y, X, R, G, B.
¿Tienes un correo electrónico de jmp al que puedo contactarte?
Saludos,
Amit
John Ponte escribió: Hola Amit, Esto seguro es posible y ella ... John Ponte escribió:
Hola amit
Esto seguro es posible y aquí está el JSL para hacerlo:
// Abrir / leer la imagen en JMP
img = NewImage ("$ SAMPLE_IMAGES \ tile.jpg");
// Obtener los valores de color como 3 matrices distintas
{r, g, b} = img << getPixels ("rgb");
// Obtener las dimensiones de la imagen / matrices.
numRows = nrow (r);
numCols = ncol (r);
// Crear una tabla de datos
dt = Nueva tabla ("Datos de píxeles",
newColumn ("Y", establecer valores (forma (repetir (1 :: numRows, numCols) `, numCols, numRows))),
nuevaColumna ("X", valores establecidos (repetición (1 :: numCols, numRows))),
nuevaColumna ("R", establecer valores (r)),
nuevaColumna ("G", establecer valores (g)),
nuevaColumna ("B", establecer valores (b)),
);
Los valores de x e y son la ubicación de píxeles en la imagen. Los valores r, g y b son los componentes de color de cada píxel, en el espacio de color normalizado (valores entre 0.0 y 1.0). Solo cambia la primera línea para hacer referencia a tu propia imagen y deberías estar listo. Aunque también es posible que desee cambiar el nombre de la tabla de datos.
Déjame saber si tienes alguna otra pregunta y buena suerte!
Juan
amit bothra escribió: Hola John, quiero crear un conjunto de datos de ... amit bothra escribió:
Hola John,
Quiero crear un conjunto de datos a partir de una imagen que tenga las siguientes columnas: X, Y, r, b, g donde X e Y son coordenadas y R, G y B son los colores. Es esto posible en JMP.
Mi idea es ejecutar un K significa clúster en él. Mi fuente para esto es http://lamages.blogspot.com/2012/12/now-i-see-it-k-means-cluster-analysis.html#more
Saludos,
Amit
Zoe Jewell escribió: ¡Muy bien! Me gusta especialmente la forma en que JM ... Zoe jewell escribió:
¡Muy aseado! Me gusta especialmente la forma en que JMP puede generar los datos de caracteres comprimidos.