Base64 a imagen


([N1] jchacon) #1

Buenas noches,

estoy intentando guardar una imagen recibida en base64 mediante las clases VImage y VByteArray.

La función que he creado es la siguiente pero no consigo ver donde esta el error ya que no me guarda la imagen en el disco.

Aprovecho también para preguntar si existe la posibilidad de grabar directamente la imagen recibida, una vez decodificada , en un objeto dibujo de una tabla sin tener que guardar la imagen primero en el disco.

gracias de antemano.

importClass(“VImage”);
importClass(“VByteArray”);

//cadena recibida en base64 de la imagen.
var B64 = theRoot.varToString( “INPUT” );
//ruta para guardar la imangen.
var PATH = theRoot.varToString( “PATH” );

// Desde una cadena Base64 obtenemos una imagen
var oTexto = new VByteArray();
var oByteArray = new VByteArray();
var oImage = new VImage();

// Cadena Base64 con la imagen
var cBase64 = B64;
// Cargamos el Texto en Base64
oTexto.setText(cBase64);
// Obtenemos el ByteArray con el contenido original de la imagen
oByteArray.fromBase64(oTexto);

var PathImagen = PATH;
oImage.loadFromData(oByteArray,‘PNG’);
oImage.save(PathImagen);


([N3] synetic) #2

Existía un bug relacionado con esto. Era el número 3906, pero no tengo acceso al vBugman para comprobar el estado. Lo último que se es que estaba en revisión por el departamento de desarrollo.

Un saludo.


([N3] pacosatu) #3

Hola jchacon.

El código que muestras parece a primera vista que está correcto y debería de funcionar.
Pon la línea: alert(oTexto.toLatin1String()) y comprueba que la cadena Base64 es correcta.
(envía el pantallazo o un adjunto de la cadena Base64 de ejemplo)
Ten en cuenta que la cadena Base64 no debe contener al principio información del esquema usado en las URI’s o tags HTML.

En cuanto a la segunda cuestión, es cierto como dice @synetic que la función setField() no funciona ni con campos de dibujo ni con campos binarios, tampoco funcionan con VBytearray ni con VImage. Tendrás que usar el comando de Velneo “Importar dibujo”. Es una lástima que exista este bug y espero que para la 7.17 esté solucionado totalmente.

Saludos
Paco Satué


([N1] jchacon) #4

Gracias Paco,

la cadena en principio parece ser correcta, lo único que detecto es que cuando muestro el alert, donde lleva un signo + me crea un salto de linea.

Seguiré investigando, y efectivamente e una lastima que setField() no funcione con campos dibujo, tendré que usar como comentas importar dibujo, siempre y cuando consiga guardar la imagen :).

un saludo


([N1] jchacon) #5

Subo el adjunto con la imagen en base64 dentro de un rar, ya que es demasiado larga para pegarla directamente y el txt tampoco lo deja subir por exceso de tamaño

de nuevo gracias.

base64.rar (427 KB)


([N3] pacosatu) #6

Hola jchacon.

Trabajar con cadenas Base64 tan grandes puede no ser muy operativo en aplicaciones Velneo.
De todas formas coge la imagen PNG original u otra más pequeña y pásala por un conversor Online (por ejem http://www.cssportal.com/image-to-data/).

Coge la cadena Base64 que genera el conversor y prueba.
A mí todas las cadenas Base64 de imagenes PNG siempre empiezan con iVBOR…

Saludos
Paco Satué


([N1] jchacon) #7

Gracias Paco,

voy a buscar otra alternativa ya que lo que detecto son dos cosas,

1º La cadena base64 que le paso en la variable al proceso se corta supongo que por algún tipo de limitación en la longitud de caracteres de la variable,

2º en la variable cuando detecta un signo + dentro de la cadena genera un salto de linea, por lo cual la cadena base64 que le paso al final esta llena de espacios en blanco.

Supongo que como consecuencia de esto no se puede generar la imagen.

Un saludo y gracias por tus comentarios.


([N1] robertocofiex) #8

Hola, lo de img a base64 correcto, pero me interesa codificar y descodificar textos en base64, ¿Como puedo hacer?

Gracias.


([N4] Fran) #9

Buenos días:

Las funciones para codificar y decodificar cadenas en base64 son:

https://velneo.es/info_v7_719_es/velneo_vdevelop/scripts/clases/core/vbytearray/#toBase64
https://velneo.es/info_v7_719_es/velneo_vdevelop/scripts/clases/core/vbytearray/#fromBase64