Tengo una tabla Firebird DB, que contiene campos con datos de imagen (como blob sybtype -5). Necesito obtener estos datos y convertirlos en un archivo de imagen. El ejemplo de código a continuación crea un archivo (pero el tamaño es muy grande y, al intentar abrirlo, se dice que ese archivo no es un archivo BMP correcto). ¿Que me estoy perdiendo aqui?
result[0].OBJ_IMAGE1((err, name, eventEmitter) => { if(err) throw err; let chunks = []; eventEmitter.on('data', chunk => { chunks.push(chunk); }); eventEmitter.once('end', () => { let buffer = Buffer.concat(chunks); fs.writeFile('test.png', buffer, err => { if(err) throw err; console.log('image file written'); }); }); });He probado su código y escribirá correctamente el blob en un archivo. Por lo tanto, su problema es, como también se discutió en los comentarios, uno de no saber cuál es el tipo de archivo de imagen real, por lo que lo está almacenando con la extensión de archivo incorrecta. Debe conocer el tipo de archivo (o la codificación o el cifrado) utilizado por la aplicación que almacena los datos de la imagen para poder seleccionar la extensión de archivo correcta, el visor de imágenes para mostrar los datos y/o las transformaciones adicionales necesarias para obtener un archivo visible.
Mirando los datos de ejemplo y el enlace de firmas de archivos que Marcodor proporcionó, es posible que los datos almacenados sean del tipo "Archivo JPEG estándar con metadatos Exif" ( FF D8 FF E1 xx xx 45 78 69 66 00 ), pero el archivo tiene el prefijo 5 bytes de datos específicos de la aplicación (tal vez algún tipo de identificador, o una longitud de archivo, o algo así). Basado en eso, intente usar SUBSTRING(OBJ_IMAGE1 FROM 6) y vea si guardar como jpg le permite abrir el archivo (NOTA: ¡Esto no significa necesariamente que todos los archivos almacenados en estos blobs sean JPEG!).
Aparte, es más eficiente almacenar la imagen usando:
result[0].OBJ_IMAGE1((err, name, e) => { if (err) throw err; var imgStream = fs.createWriteStream('filename.ext') e.pipe(imgStream); }); El uso pipe escribirá los fragmentos directamente en un archivo a medida que se reciban, en lugar de acumular todo el archivo en la memoria antes de escribirlo.