Manejo de imágenes
Los jobs de OpenFn se ejecutan en JavaScript y, en la mayoría de los casos, manejan datos JSON de API REST o de webhooks. Recibimos JSON, lo transformamos con JavaScript y luego lo enviamos a otra API REST. Sin embargo, a veces necesitas trabajar con imágenes u otros archivos binarios. En esta página te explicamos cómo hacerlo.
Las imágenes y otros archivos binarios, en general, simplemente funcionan™️. Los casos poco comunes podrían requerir cambios en los adaptors.
¿Necesitas cambiar el tamaño de una imagen, comprimirla, quitarle o agregarle
metadatos EXIF, o leer sus metadatos? Usa el
adaptor image-utils, que ejecuta estas
operaciones de forma nativa en tu job, sin necesidad de un microservicio
externo. Consulta
Manipulación de imágenes con el adaptor image-utils
más abajo para ver los detalles.
- Sin acceso a binarios externos: los jobs de la plataforma siguen
ejecutándose en un entorno aislado de Node.js y no pueden invocar programas
externos como
imagemagickoffmpeg. El adaptorimage-utilsfunciona completamente dentro del entorno de ejecución de Node.js, así que no los necesita. - Archivos grandes: Base64 aumenta mucho el tamaño del payload, así que
evítalo con archivos grandes siempre que puedas. Es mejor trabajar con Buffers
(el formato que devuelven por defecto las operaciones de
image-utils).
Base64 (manejo estándar)
En esencia, para trabajar con imágenes, PDF u otros archivos, guardarlos en
state y pasarlos de un step a otro en un workflow de OpenFn, hay que
codificarlos en base64 y luego volver a convertirlos en Buffers antes de
enviarlos a la API de un sistema de destino.
El adaptor HTTP ya tiene todo lo que necesitas para hacerlo. Consulta:
- Opciones de solicitud (
parseAs) - Codificar una cadena en formato Base64.
- Decodificar una cadena codificada en Base64 para devolverla a su formato original.
Compatibilidad nativa en los adaptors
Algunos adaptors (DHIS2, FHIR-4, Sunbird-RC) manejan binarios de forma integrada en endpoints conocidos de imágenes o archivos. Cuando solicitas un archivo (una imagen, un PDF, etc.), la respuesta se convierte automáticamente en una cadena codificada en base64.
Trabajar con Buffers
También puedes trabajar directamente con buffers en el código de un job de OpenFn, con código como este:
fn(state => {
const encoded = Buffer.from(state.data.myBase64string, 'base64');
return { ...state, encodedImage };
});
o bien:
fn(state => {
const decoded = state.data.myBuffer.toString('base64');
return { ...state, decoded };
});
Manipulación de imágenes con el adaptor image-utils
En los workflows que necesitan transformar una imagen, y no solo moverla, usa el
adaptor image-utils. Ofrece:
// resize an image to given `width`/`height` dimensions.
resize(state.data.buffer, { width: 1200, height: 1600 });
// reduce image quality/file size until it meets a target `maxBytes`, down to a `minQuality` floor.
compress(state.data.buffer, { maxBytes: 700 * 1024, minQuality: 20 });
// remove all EXIF metadata from an image.
stripMetadata($.data.photoBase64);
// write EXIF key-value pairs (e.g. `UserComment`) into a JPEG.
embedMetadata($.data.buffer, { UserComment: 'patient-id=42' });
// read an image's dimensions, orientation, size, and EXIF data without modifying it.
metadata($.data.photoBase64);
Cada operación acepta una cadena Base64 o un Buffer y escribe su resultado en
state.data (normalmente como buffer; si necesitas una cadena, tienes
disponible parseAs: 'base64').
Consulta la
documentación del adaptor image-utils
para ver todos los detalles sobre las opciones y los valores que devuelve cada
función.
Resumen
La mayoría de los casos de uso, como obtener una imagen de un sistema y subirla
a otro, deberían simplemente funcionar™️. En los workflows que necesitan
transformar la propia imagen (cambiar su tamaño, comprimirla, quitarle o
agregarle datos EXIF, o leer sus metadatos), usa el
adaptor image-utils como se describe
más arriba.