OpenJPEG

En el post anterior hablaba de cómo las imágenes JPEG2000 no tienen mucho soporte en visores de comics para Linux así que me hizo preguntarme, si quisiera escribir mi propio visor de comics con soporte para imágenes .jp2, ¿qué librería podría usar?.

Lo primero que pensé fue usar la librería GFL SDK del mismo autor de XnView; ya la había usado antes cuando aún usaba Windows así que parecía una buena opción a pesar de no ser open source pero, desafortunadamente, parece ya no estar en desarrollo y, aunque es posible que aún funcione, al revisar la documentación me encontré con que la versión más reciente para descargar no soporta JPEG2000 en Linux por lo que no era una opción.

Después de un poco de Google me encontré con la librería OpenJPEG que está activamente en desarrollo y parecía lo suficientemente fácil de compilar para hacer pruebas así que descargué una copia del código desde su página de github y procedí a intentar compilar la librería.

De acuerdo a la documentación, la librería no tiene ninguna dependencia pero para compilar los programas de ejemplo necesita los siguientes paquetes: liblcms2-dev, libtiff-dev, libpng-dev y libz-dev. Aún si no están instalados en tu sistema, la librería viene con una copia de esos paquetes y detecta si están instalados para decidir cuál versión usar. En este caso, yo ya tenía todos estos paquetes instalados desde el gestor de paquetes de Debian.

La compilación de la librería fue bastante simple:

monstruosoft@debian:~$ cd openjpeg-master
monstruosoft@debian:~/openjpeg-master$ mkdir build
monstruosoft@debian:~/openjpeg-master$ cd build
monstruosoft@debian:~/openjpeg-master/build$ cmake .. -DCMAKE_BUILD_TYPE=Release
-- Your system seems to have a Z lib available, we will use it to generate PNG lib
-- Your system seems to have a PNG lib available, we will use it
-- Your system seems to have a TIFF lib available, we will use it
-- Your system seems to have a LCMS2 lib available, we will use it
-- Configuring done
-- Generating done
-- Build files have been written to: /home/monstruosoft/openjpeg-master/build
monstruosoft@debian:~/openjpeg-master/build$ make

Eso fue fácil. Ahora había que probar que funcionara correctamente; no sería la primera vez que después de compilar una librería me encuentro con que no funciona correctamente. Podemos probar la librería con uno de los programas de ejemplo en el directorio bin/. El programa opj_decompress convierte un archivo JPEG2000 en otro formato como, por ejemplo, PNG. Puedes ver la lista completa de opciones para opj_decompress en la documentación pero para probar la librería basta con usar la opción -i para especificar el archivo JPEG2000 de entrada y la opción -o para especificar el archivo de salida:

monstruosoft@debian:~/openjpeg-master/build/bin$ ./opj_decompress -i prueba01.jp2 -o salida.png

[INFO] Start to read j2k main header (3199).
[INFO] Main header has been correctly decoded.
[INFO] No decoded area parameters, set the decoded area to the whole image
[INFO] Header of tile 1 / 1 has been read.
[INFO] Stream reached its end !
[INFO] Generated Outfile salida.png
decode time: 47 ms

El comando anterior genera un archivo .png a partir del archivo original .jp2., lo que significa que la librería funciona y que estamos en la dirección correcta. Aún hace falta averiguar las funciones y el orden en que las debemos llamar para abrir y decodificar una imagen JPEG2000 desde nuestro código, hacer conversión de color si es necesario y ajustar la salida a la librería que estemos usando para la presentación final en pantalla, algo para lo que hay muy poca documentación por lo que la mejor fuente y la forma más fácil de averiguarlo sería revisando el códido del programa de ejemplo.

Aunque de momento no estoy tratando de usar la librería desde mi propio código, al menos ahora sé que sí existe una librería para decodificar imágenes JPEG2000 en Linux.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s