¡Seguro! A continuación encontrará el código que hizo el trabajo. Creamos un pequeño ejemplo de SQL, pero tampoco soy un experto en SQL, así que ten cuidado.
Este código es capaz de transferir archivos JPG con un tamaño máximo de 256 kB. Si desea transferir imágenes más grandes, simplemente aumente el número de columnas, es decir, agregue ImgVarChar8, ImgVarChar9, etc.
Tal vez puedas ayudarme con mi pregunta de seguimiento. aquí ?
¡Salud!
-------------- Inicio del código SQL --------------
CREAR TABLA tIMG(
ID INT clave primaria de identidad,
Img VARBINARIO(MAX)
)
IR
INSERTAR EN tIMG(Img) SELECCIONAR BulkColumn DESDE
OPENROWSET(BULK 'C:\Test\test.jpg', SINGLE_BLOB) COMO InsertIMG
IR
CREAR VER vImg COMO
SELECCIONAR convertir(varchar(max),subcadena(Img,0,32000),2) ImgVarChar0
,convertir(varchar(max),subcadena(Img,32000,32000),2) ImgVarChar1
,convertir(varchar(max),subcadena(Img,64000,32000),2) ImgVarChar2
,convertir(varchar(max),subcadena(Img,96000,32000),2) ImgVarChar3
,convertir(varchar(max),subcadena(Img,128000,32000),2) ImgVarChar4
,convertir(varchar(max),subcadena(Img,160000,32000),2) ImgVarChar5
,convertir(varchar(max),subcadena(Img,192000,32000),2) ImgVarChar6
,convertir(varchar(max),subcadena(Img,224000,32000),2) ImgVarChar7
DESDE [dbo].[tIMG]
IR
-------------- Fin del código SQL --------------
-------------- Inicio del código JMP --------------
// Consulta SQL para obtener los datos hexadecimales (cadenas) de la base de datos.
// Las cadenas se almacenan en diferentes columnas en la tabla de datos "JPG_Query".
Nueva consulta SQL (
Conexión(
"Su conexión"
),
Nombre de consulta ("JPG_Query"),
Seleccionar( Columna( "ImgVarChar0", "t1" ), Columna( "ImgVarChar1", "t1") ,
Columna ("ImgVarChar2", "t1"), Columna ("ImgVarChar3", "t1"),
Columna ("ImgVarChar4", "t1"), Columna ("ImgVarChar5", "t1"),
Columna( "ImgVarChar6", "t1") ,Columna( "ImgVarChar7", "t1" ) ),
De( Tabla( "vImg", Esquema( "dbo" ), Alias( "t1" ) ) ),
) << Ejecutar;
// Bucle para construir la imagen JPG a partir de las cadenas hexadecimales y mostrar la imagen (tal vez haya algún código redundante...)
cambiar = 0;
contar_intento = 0;
intento_max = 200;
código hexadecimal = "";
Mientras(cambiar == 0 & count_try < max_try,
contar_intento++;
Intentar(
código hexadecimal1 = Tabla de datos("JPG_Query"):Nombre("ImgVarChar0")[1];
código hexadecimal2 = Tabla de datos("JPG_Query"):Nombre("ImgVarChar1")[1];
código hexadecimal3 = Tabla de datos("JPG_Query"):Nombre("ImgVarChar2")[1];
código hexadecimal4 = Tabla de datos("JPG_Query"):Nombre("ImgVarChar3")[1];
código hexadecimal5 = Tabla de datos("JPG_Query"):Nombre("ImgVarChar4")[1];
código hexadecimal6 = Tabla de datos("JPG_Query"):Nombre("ImgVarChar5")[1];
hexcode7 = DataTable("JPG_Query"):Nombre("ImgVarChar6")[1];
hexcode8 = DataTable("JPG_Query"):Nombre("ImgVarChar7")[1];
código hexadecimal = código hexadecimal1||códigohexadecimal2||códigohexadecimal3||códigohexadecimal4||códigohexadecimal5||códigohexadecimal6||códigohexadecimal7||códigohexadecimal8;
imagen = Abrir(Hex a Blob(código hexadecimal), "jpg");
Si (falta (código hexadecimal) == 0 y se puede programar (tabla de datos ("JPG_Query")) == 1,
Nueva ventana ("Imagen JPG", imagen);
código hexadecimal = "";
cambiar = 1;
Cerrar(Tabla de datos("JPG_Query"), NoGuardar);
);
,
Esperar(0,01);
Si (count_try == max_try,
Lanzar("¡Error!");
);
); // Cerrar intento
); // cerrar mientras
-------------- Fin del código JMP --------------
No hay motivo para lamentarse. Me sorprende lo rápido que se dan las respuestas aquí.
Y de nuevo, ¡muchas gracias! Hasta ahora pudimos hacer lo siguiente:
1. En la base de datos, convertimos la imagen de BLOB (varbinary(max)) a hexadecimal usando la función CONVERTIR y estableciendo el estilo en "2"; esto omite el "0x" al principio de la cadena.
2. Transferimos la cadena hexadecimal a jmp mediante una consulta donde se guarda en una tabla de datos.
3. Mostramos la imagen con la función que mencionaste: Nueva ventana ("Foo", Open(HexToBlob(hex-string)), "jpg")
Pero ahora nos encontramos con el problema de los 64k. Como descubrimos que esto básicamente significa que solo podemos almacenar 64k en una sola celda en una tabla de datos, tuvimos la idea de dividir la cadena hexadecimal en la base de datos en varias columnas y concatenarla nuevamente en jmp después de importar el partes en varias columnas.
Informaré sobre esto pronto.
¡Qué tenga un buen fin de semana!
EDITAR: ¡Funciona! Pudimos transferir el JPG dividiendo primero la imagen binaria en partes, convirtiendo las partes en la base de datos a hexadecimal, transfiriendo las partes hexadecimales y finalmente concatenándolas nuevamente en jmp. ¡Realmente grandioso! Gracias.
Perdón por tardar tanto.He estado investigando un poco sobre esto (gracias Bryan), creo que estará limitado por un buffer de 64K en JMP 12 que evitará que funcione con imágenes de más de 32K (después de duplicar su tamaño en hexadecimal, llegaron al problema de 64K) .Eso no es mucho, ni siquiera en un JPG.Bryan (sabe mucho más SQL que yo) dice "Si hice una columna "codificada" de VARCHAR(max) y codifiqué el varbinary usando CONVERT, entonces obtengo los datos de cadena HEX como se esperaba".Aquí hay una referencia https://basitaalishan.com/2014/09/11/sql-server-converting-binary-data-to-a-hexadecimal-string/ Encontré; omita el 0x (estilo) en el frente del hexágono que envía a JMP.
Una vez que tenga los datos hexadecimales de la conversión y los coloque en una tabla de datos JMP, debería poder recuperar la imagen de esta manera:
//hexadecimal = hexadecimal(loadtextfile("$desktop/hi.jpg",blob)); // así es como obtuve algunos datos hexadecimales
//escribir(hexadecimal);
hexadecimal="";
imagen = abrir( hextoblob(hexadecimal), "jpg");
nueva ventana ("decodificada", imagen);
un jpg 4K.
Hola Craig,
gracias por tu respuesta. Sí, de hecho se trata de datos codificados en hexadecimal. De hecho, leemos un JPG con un software .NET en una base de datos, donde se guarda en una columna de tipo varbinary (max). Entonces, como usted dice, supongo que es posible transferir los datos codificados en hexadecimal a jmp mediante una consulta SQL. Respecto a esto, tenemos dos preguntas:
1. ¿Cómo se lee una columna varbinary(max) en una columna de caracteres en jmp mediante una consulta?
2. ¿Qué hay que hacer para transformar los datos de la columna de caracteres en una imagen?
Sé que esas preguntas pueden ser exageradas, pero se agradece cualquier pequeña pista.
¡Gracias!
EDITAR: me topé con este hilo , que aborda lo que queremos hacer. En referencia a esto, supongo que primero es necesario transferir los datos BLOB a hexadecimal en la base de datos y luego transferirlos a JMP.
Creo que JMP sí no Admite la transferencia de datos binarios desde SQL.Pero, si puede llevar los datos binarios a JMP, tal vez como datos codificados en hexadecimal en una columna de caracteres en una tabla de datos, entonces se pueden volver a convertir en una imagen.Necesitará saber cuál es el formato de los datos: JPG, PNG, RAW.Si es RAW, necesitarás saber cuál es el formato sin formato y cómo trabajar con él.
Cuando leí la pregunta por primera vez, imaginé que la matriz de bytes contenía datos RAW RGB, pero parece más probable que fuera PNG o JPG, lo que sería un problema más simple que decodificar los datos RAW.