Alguien sabe como puedo utilizar para convertir una cadena base64 en una imagen (formado png), de forma que pueda guardar la imagen en un archivo?
Se trata de una aplicación de firma electrónica. Puedo obtener la firma en un formato de base 64 que la tengo guardada en un campo, pero es necesario para salvar la firma como un archivo de imagen a utilizar para integrarse en un informe.
Gracias anticipadamente por vuestra ayuda.
Maria Granados.
Ya habrás imaginado que necesitas usar el API de Velneo para conseguir eso.
El proceso es el siguiente:
- Cargas el string Base64 en un ByteArray mediante la clase VByteArray
oByteArray_B64.setText(theRegisterIn.fieldToString("FIRMA_B64"))
- Decodificamos el string Base64 a valores binarios del PNG original
oByteArray_PNG.fromBase64(oByteArray_B64)
- Obtenemos un objeto Imagen con la Firma PNG. Usamos la clase VImage
oImage.loadFromData(oByteArray_PNG,'PNG')
- Guardamos en disco la Firma como un fichero de extensión png
oImage.save(<firma.png>)
- o en un campo de tipo Objeto Binario (de tipo binario para no perder la transparencia del PNG)
theRegisterIn.setFieldByteArray("FIRMA_BIN", oByteArray_PNG)
Como ves es muy sencillo, además en el foro este es un tema recurrente.
Saludos
Paco Satué
Cogiendo el ejemplo que le adjuntaste a la Maria, y siguiendo cada linea consigo guardar la cadena base64 a un archivo PNG, que además guarda la transparencia correctamente.
Pero si en vez de quererlo guardar en un archivo PNG, lo quiero guardar en un campo de tipo Objeto Dibujo no me respeta la transparencia.
¿Como puedo hacerlo para que consiga en un campo Objeto Dibujo tener una imagen obtenida desde un archivo?
No sé si le ha funcionado a María porque no ha contestado.
La teoría dice que el campo Objeto de Tipo Binario almacena el contenido sin ningún tipo de manipulación y/o conversión.
Por lo tanto y siendo el PNG un fichero en formato binario no deberías tener pérdida de información, en este caso el canal Alfa.
En resumen, el campo Objeto de Tipo Binario devuelve la información tal cual ha sido guardada, independientemente del tipo de archivo que hayamos utilizado.
Que yo sepa los Informes nativos solo admiten Dibujos estáticos (adjuntos al proyecto como jpeg o png) y los campos Objeto Dibujo (en este caso solo es posible jpeg).
Si tienes dibujos PNG con transparencia, y quieres guardarlos en una tabla para mostrarlos en Informes, tendrás que convertirlos a JPEG con una herramienta externa.
Lamentablemente la conversión que hace Velneo de PNG a JPEG cuando guardamos en un campo de Tipo Dibujo, no funciona.
Muéstrala en formato HTML en un control “Caja de texto enriquecido”
…
<textarea>
</textarea>
…
En un vReport (en teoría) se pueden mostrar imágenes en formato base64 como un control HTML o como imagen/formato: “Codificado Base64” (adjunto captura de pantalla)
hay que meterlo en un HTML completo (al menos a mí sólo me funcionó así)
Te adjunto captura de pantalla de un campo fórmula para mostrar el logo que está en la misma tabla
También hace falta controlar la renderización con el CSS y los márgenes y mostrarlo en un control Campo enriquecido
Podéis verlo en funcionamiento en el apartado “Superponer imágenes transparentes usando VByteArray” de los ejercicios (vatp://pruebas:pruebas@v7cloud6.velneo.com:8894/0PS_Varios_iapp). Pulsar Ctrl+F1 en el formulario para acceder a la ayuda y al código HTML del control Texto enriquecido.
Verás que en el Informe nativo se han superpuesto varias imágenes PNG. Evidentemente con el campo Objeto Tipo Dibujo de Velneo es imposible porque no soporta transparencia. La gestión de cadenas Base64 suple esta deficiencia grave de Velneo.
Hasta ahora utilizaba los tag “pre” y “code” y funcionaba bien. Si inspeccionas el código HTML de tu mensaje y el mío verás que son iguales y sin embargo el mío no se visualiza bien, por lo menos en Firefox.
Cuando uso el botón “code” se insertan dos apóstrofes y pensaba que era un error del editor.
Voy a probar a partir de ahora con los códigos BBCode -> code y /code entre corchetes.
"<!DOCTYPE html>
<html>
<head>
<style>
body { overflow:hidden; }
html { overflow:hidden; }
.recortable {
position: absolute;
height: 300px;
width: 150px;
left: 0px;
top: 0px;
}
</style>
</head>
<body>
<!-- No ha funcionado el solapar 2 capas -->
<div class='recortable'><img src='image/png;base64," + #REC_NENES.NENE_B64 + "' /></div>
</body>
</html>
"
Retiro lo de “porquería” pero sí es cierto que debería haber un Preview del mensaje o ya de paso actualizar a un editor Web 2.0.