sábado, 30 de abril de 2011

Guión para convertir de RGB888 (24 bits) a RGB444 (12 bits)

Segúramente conozcas la función de GIMP que permite convertir la imagen en indexado (paletas de hasta 256 colores).

Muchas pantallas LCD de dispositivos portátiles (como teléfonos móviles) no permiten mostrar colores de 24 bits (RGB 888 unos 16 millones de colores diferentes) como en las pantallas normales, sino que van limitados en cuanto a número de colores, a menudo 12 bits (admiten 16 variaciones de rojo, de verde y de azul, en total unos cuatro mil colores). Este proceso no lo puede realizar GIMP de forma directa, como la conversión a indexado.

Hay que destacar que el formato RGB444 es totalmente difernete del indexado. El formato indexado trabaja con referencias, lleva una lista (índice) de colores, y en la imagen solo hay referencias a esa lista. Para mostrar esas imágenes en pantalla, se lee la imagen y en la pantalla se dibujan los colores que son indicados en esa lista. En los formatos RGB888 y RGB444, no hay lista de colores, y el contenido de la imagen son los propios colores, que se dibujan de forma directa en la pantalla.

Si en esas pantallas se muestra una imagen tal cual, sin tratar, los colores quedarán truncados, de forma similar a la función posterizar de GIMP. La forma de evitar esto es relatívamente simple: tratar previamente la imagen para que tenga solo los colores que la pantalla muestra, y además, usar esos colores de forma que se mezclen y creen la apariencia de un color real de 24 bits. Más o menos como la conversión a indexado de GIMP, que la opción de difuminado del color "ninguno" funciona mal en fotos reales porque trunca los colores, en cambio las otras opciones los truncan y los difuminan, de forma que el truncamiento se nota menos.

Este formado te 12 bits se llama RGB444, ya que cada canal se lleva 4 bits, es decir, admite 16 intensidades diferentes, entre todos los canales se admitiría 16×16×16=4096 colores. Si la información admite transparencia se le llama ARGB 4444, ya que son cuatro canales.



Recientemente se ha publicado en el registro de gimp un guión que permite convertir a ARGB4444 en uno o dos clics de ratón (uno para aplanar la imagen y otro para convertir). Si tienes que trabajar con una pantalla de estas puedes este guión te podría venir muy bien para hacer conversiones.

No hay mucho más que decir, salvo dejar unos ejemplos y enlaces para comparar entre RGB888 (imagen original), el formato RGB444 que podría producirse si se trunca el color y el formato RGB444 que produce este guión.
http://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_palettes#24-bit_RGB

Imagen original:


Esto es lo que pasa si se truncan los colores sin más, observa los colores sólidos del asfato o el cielo.


Y así queda si se difumina el color un poco:

Finalmente una ampliación para comparar diréctamente:

Se puede ver que el resultado de este guión es visualmente mucho mejor.

jueves, 21 de abril de 2011

Detección adapativa de bordes

Antes de seguir leyendo, recomiendo que vayas a la página del complemento del blog, y veas las imágenes. Por si mismas explican casi todo lo que hace el filtro.

GIMP tiene varios algoritmos de detección de bordes. Todos ellos pueden producir efectos interesantes, pero ninguno está adaptado a producir una imagen de líneas de un solo píxel de anchura jústamente donde hay bordes y sin producir zonas borrosas.

Desde el blog Tea Driven Design (Daniel Parnham) se ha creado un complemento llamado Adaptive threshold edge detect. Este complemento está basado en un algoritmo del profesor John Robinson de la universidad de York, siendo modificado y adaptado por el autor.

Este algoritmo modificado permite mejorar los resultados en imágenes comprimidas en JPEG. Esto es porque ese modo de compresión introduce artefactos en las imágenes que luego podrían ser revelados por el algoritmo de detección de bordes, empeorando en resultado final y obligando a retocarlo. La segunda imagen de la entrada del blog muestra muy bien este problema. La fila columna de la derecha contiene círculos que fueron comprimidos en JPEG (en la izquierda están intactos). Los de arriba está sin aplicar filtro, los del medio tienen el algoritmo de Canny y los de abajo tienen el creado por este autor.

Un pequeño inconveniente de este algoritmo es que trabaja con toda la imagen a la vez, lo que obliga a usar mucha memoria. No obstante, en ordenadores modernos es difícil llegar a saturar la memoria, sería necesario una imagen de muchas decenas de megapíxeles.

Hacía mucho que no publicaba una entrada, pero este algoritmo me ha motivado.

Enlace interesante con imágenes de ejemplo: Tea Driven Design: Adaptive Threshold Edge Detection in GIMP.

El complemento se puede descargar aquí: http://registry.gimp.org/node/25229
Código fuente (para programadores): https://github.com/parnham/plugins

jueves, 8 de enero de 2009

SVG en una página web

Meter un fichero en una página web no es en principio difícil, basta con añadir esta etiqueta:

<
EMBED SRC="mifichero.svg" ALIGN="left" WIDTH="tamaño" HEIGHT="tamaño"
>


En principio cualquier persona con un navegador compatible con SVG podría visualizar el fichero. Al ser SVG un formato vectorial, se puede agrandar la imagen sin que esta se vuelva borrosa o se muestre pixelada, para ello basta dar valores a las variables WIDTH y HEIGHT.

A veces surge un problema con ciertos editores (como Inkscape en la versión 0.46 o menor), y es que incluyen ellos ya un tamaño específico para la imágen, con lo que al cargar la imágen en una página web, y darla un tamaño diferente, esta no cambia de tamaño como debiera, dejando márgenes vacíos o apareciendo recortada. Explicado de otra forma, la imágen no se adapta al tamaño especificado por el conenedor creado antes con la etiqueta EMBED.

Con un editor de texto se puede resolver este problema, basta abrir la imagen SVG en un editor de texto (Gedit, Mousepad, Bloc de notas...) y añadir dentro de la etiqueta SVG el siguiente texto: viewBox="0 0 100 120", habría que sustituir 100 por el tamaño horizontal y 120 por el vertical de la imagen (estos valores aparecen en las variables width y height de esa etiqueta). Además, hay que modificar los valores de las variables width y height, sustituyendo su valor por "100%".

En Inkscape la etiqueta SVG suele quedar más o menos por el principio del documento.

El cambio sería este, Inkscape podría dejar el fichero SVG así:

< svg
...
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

width="100"

height="120"

id="svg2"
...
>
...


y modificado quedaría así:

< svg
...
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

width="100%"

height="100%"

viewBox="0 0 100 120"
id="svg2"
...
>
...


Hecho esto, la imágen se adaptará automáticamente al tamaño del contenedor que se le asigne con la etiqueta EMBED explicada al principio.

sábado, 27 de diciembre de 2008

Extrayendo imágenes de documentos PDF

Una forma rápida y sencilla de sacar una imagen de un archivo PDF es tomar una captura de pantalla y recortarla con algún editor de imagen como GIMP. Este procedimiento es muy sencillo, pero no siempre ofrece la mejor calidad ni toda la resolución original de la imágen.

Hay varios programas que permiten extraer las imágenes de un fichero PDF. Voy a comentar uno de ellos: PDF_to_JPG, aunque si lo que buscas es un programa orientado a un propósito más o menos general para un usuario intermedio, te recomiendo que mires el tercer párrafo por el final de esta entrada, donde hablo de PDF Image Extractor.

PDF_to_JPG tiene dos ventajas muy destacables: es libre y extrae las imágenes sin modificarlas (los ficheros PDF suelen contiener las imágenes comprimidas con JPEG, y no es bueno comprimir una imágen muchas veces). Su principal pega es que es un programa reciente y todavía tiene carencias y fallos (hay ficheros PDF que fallan). Este programa tiene una versión compilada para Windows, aunque también puede usarse en Linux si se compila el código fuente.

Su uso es a través de consola (no dispone de una interfaz gráfica), aunque existen procedimientos para facilitar su uso sin necesidad de teclear comandos en plan MS-DOS.

Para usar el programa es necesario descargar el programa y descomprimirlo en una carpeta. Si se usa GNU/Linux habrá que compilar el código fuente (creo que se puede compilar con gcc, más abajo lo explico).

Una vez con una carpeta con los ficheros del programa, se puede empezar a usarle mediante consola, pero es más práctico usar otro procedimiento: usar guiones (scripts) que contengan las instrucciones que se meten por consola. En Windows son los ficheros BAT. Estos ficheros son fáciles de crear, modificar y usar, ya que son ficheros de texto que permiten ejecutar comandos de consola con solo hacerles doble clic, y se pueden modificar con el Bloc de notas. En Linux es muy similar, son ficheros SH y con activarles el permiso de ejecución ya se pueden usar.

Para crear el fichero BAT basta crear en la misma carpeta del programa un fichero de texto nuevo y llamarle "p2j.bat" (o cualquier nombre terminado en .bat). Una vez con este fichero, se pulsa con el botón derecho y se pulsa en editar. Se abrirá el Bloc de notas, en el hay que introducir p2j mis_fotos.pdf /NOASK y se cierra guardando los cambios (por supuesto, cambia mis_fotos.pdf por el nombre de fichero PDF que tengas). Ahora hay que copiar el fichero PDF a la carpeta donde esté el programa y el fichero BAT. Hecho esto haz doble clic sobre el fichero BAT, y el programa empezará a sacar imágenes. Las imágenes van apareciendo en una carpeta nueva que crea el programa llamada "PDF_to_JPG_files". Una vez acabado el proceso, es muy conveniente cambiar el nombre de la carpeta (por ejemplo mis-fotos). Si no se cambia de nombre la carpeta, el programa se detendrá en el siguiente uso y no extraerá imágenes.

Para sacar las imágenes después a otros documentos PDF, solo hay que ir modificando el guión con el nombre esos ficheros (botón derecho->editar), copiar los ficheros PDF a la carpeta del programa, hacerle doble clic sobre el guión (fichero BAT), esperar a que extraiga todos los ficheros y renombrar la carpeta (importante esto último, porque si ya hay creada una carpeta con el nombre "PDF_to_JPG_files" el programa no extrae imágenes).

En GNU/Linux hay que compilar el programa. Para ello hay que usar la consola, y en la carpeta del código fuente usar el comando gcc p2j.c -o p2j Luego, hay que seguir un procedimiento parecido al de Windows, solo que con ficheros SH.

Este programa no siempre funciona bien, algunas imágenes las extrae en rebandas (es más bien un problema del fichero PDF que guarda la imágen así), otras veces salen ficheros corruptos que no pueden ser leídos (fallo del programa). Si en próximas ediciones arreglan este último fallo, lo retocan para que se pueda extraer ficheros desde cualquier directorio (sin necesidad de copiarlo a la carpeta del programa) y crean paquetes de instalacción fácil para Linux (tipo apt-get) sería un programa magnífico a la altura de muchos otros comerciales.

Hay otros programas, en el blog Genbeta hay una entrada dedicada a PDF Image Extractor. Este programa es parecido al que acabo de contar, pero tiene una interfaz gráfica (ventana). Sus pegas es que no es libre, solo funciona en Windows y no permite hacer una extracción usando la compresión JPEG que tenía en el fichero PDF (permite guardarlas en PNG, pero ocupa mucho, y recomprimirlas en JPEG afecta a la calidad). A veces también devuelve imágenes cortadas en rodajas, pero como conté, es más bien culpa del fichero PDF que del programa. En este caso habría que pasar por el GIMP para pegarlas (¿Te imaginas ordenar y pegar las tiras de papel de una trituradora de documentos?).

Si usas Linux puedes usar PdfRipImage, que es parecido al programa anterior ya quetampoco permite aprovechar la compresión JPEG del fichero original, aunque si dispone de una interfaz gráfica. Lo que más se echa de menos es que aún no dispone de paquetes de instalacción fácil, y hay que instalarle compilando el código.

Para la mayoría de gente recomendaría PDF Image Extractor, pero si buscas algo que saque las imágenes de la forma más directa posible para que no se degrade su calidad te recomiendo PDF_to_JPG.

domingo, 14 de diciembre de 2008

Nuevo blog: programando con SVG

No es novedad que este blog no lleva un elevado ritmo de publicación de entradas (a ver si publico una que tengo todavía a medias guardada hace un mes...), y que es más difícil llevar dos blogs a la vez que uno solo, pero aún así he decidido embarcarme en un nuevo blog (sin abandonar este) más orientado a la programación que al diseño.

El tema es que últimamente me picaba la curiosidad por la programación con el formato vectorial SVG (el que usa Inkscape y puede ser visualizado en Opera, Google Chrome y Firefox). Concrétamente he estado trasteando desde dos puntos de vista:
  • Programas que escriben ficheros SVG a partir de unos datos previos (por ejemplo, crear gráficos).
  • Ficheros SVG interactivos similares a los SWF (que puedes manipularles con eventos).
Ya tenía tres miniproyectos a medias, y tenía ganas de ir compartiendo como los hice y los cambios que haga. Como la temática de todo esto se sale (y mucho) de lo que es un blog sobre Inkscape, GIMP y otros programas libres he decidido crear otro blog y ir actualizando los dos poco a poco según pille tiempo.

La dirección será esta:

http://trukossvg.blogspot.com/

viernes, 7 de noviembre de 2008

Espirales de entrada y salida

Hacer espirales que al llegar al centro den media vuelta y vuelvan a salir no es difícil. Se empieza activando una rejilla (da igual cual sea) y haciendo una espiral. La rejilla se activa en archivo->propiedades del documento->rejillas. Ahí se pulsa en rejilla nueva (las características de la rejilla dan igual). Luego, en Ajustar se activa la casilla "Ajustar a rejillas" y se aumenta la distancia de ajuste.
Hecho eso se traza una espiral, y en la barra de herramientas, en la opción "radio interior", se introduce 0, para que la linea de la espiral empiece en el cero.

Luego se duplica esta espiral (se selecciona y se pulsa Control+D, o bien se usa el menú edición). La espiral duplicada se la gira dos veces 90º con el menú objeto o la barra de herramientas. Así aparece girada 180, aunque desalineada:

Para alinear la espiral se selecciona la espiral y se pulsa en el menú "Trayecto->Objeto a trayecto", y aparecerá la espiral como un trayecto formado por muchos nodos. Se seleccionan todos (mediante la herramienta de edición de nodos, manteniendo pulsado el ratón y cubriendo la espiral entera). Si no se seleccionan todos, luego queda mal.
Con todos los nodos seleccionados, se alinea la espiral con la rejilla, da igual en que punto sea. En mi caso coincidía que el nodo interior de la primera espiral estaba alineado ya en la rejilla, con lo que solo tuve que alinear la segunda (la que se da la vuelta). Si no coincide, no pasa nada, se hace el proceso de conversión a trayecto y alineado en las dos espirales, y listo. Lo importante es que el punto interior coincida.

Ya casi está, se seleccionan las dos espirales y se pulsa en "trayecto->Combinar", esto hace que las dos rutas formen parte de la misma. No sirve la opción "unión", porque está creada para figuras rellenadas, no para lineas.

Parece que está listo, pero no es así, en el centro hay dos nodos superpuestos, para convertirlos en uno solo, hay que seleccionarlos arrastrando con el ratón y formando un rectángulo que cubra los dos nodos. Luego se pulsa en el botón para unir dos nodos en uno solo:

Ya estaría terminado, si se rellena, quedaría así:


Si no se rellena, queda una espiral de entrada y salida.

miércoles, 29 de octubre de 2008

Patrones a lo largo de trayecto: más guiones para las rutas

Inkscape siempre ha permitido usar varios patrones diferentes para crear las lineas:

Es interesante, pero... ¿Que pasaría si es necesario algo similar a esto?


Inkscape 0.46 incorporó una nueva función: patrones en trayecto. Esta opción deforma una ruta y la sitúa a lo largo de otra. Esta función permite crear una mayor variedad de lineas.

Unos ejemplos muestran bien como se puede usar esta herramienta:
  • Ruta con bolas:
    Este es el caso más sencillo, se dibuja un círculo pequeño, se duplica, y se desplaza hacia un lado la copia (con la tecla control se fuerza a que solo se mueva en horizontal o vertical), luego se seleccionan las dos copias y se pulsa en trayecto->unión, para que formen una única figura (en el ejemplo está de color rojo). Luego se selecciona esta figura y se pulsa en edición->copiar.
    Con esta figura ya creada, solo queda la ruta que llevará esta forma. Se puede crear con cualquier herramienta, una vez dibujada se selecciona, y se pulsa en trayecto->efectos de trayecto, se selecciona "patrón a lo largo de trayecto" y se selecciona "repetido" en el recuadro "copias del patrón". Hecho esto se pulsa sobre el botón de pegar de este diálogo (el tercero por la derecha). Si sale muy raro, tal vez es porque el patrón copiado fuera vertical (en este caso marca la casilla "el patrón es vertical". El efecto ya está listo.
    Para editar la ruta, basta seleccionar el botón de editar rutas de la barra de herramientas. La trayectoria que tenía antes la ruta aparece marcada en color rojo, y se puede editar como cualquier ruta, con la diferencia de que esta ruta tiene un efecto asignado, que se puede ver como se modifica automáticamente según se edita la ruta.
    Si se quiere editar la ruta que forma el patrón, hay que pulsar el botón de editar rutas del diálogo de efectos de ruta (el patrón aparece destacado en verde). Es importante tener en cuenta este detalle de que aunque los botones llevan iconos parecidos, tienen funciones algo diferentes.
  • Linea con puntos a un lado:
    Es sencillo, es como el caso anterior, solo que el patrón se puede dibujar con un rectángulo y un círculo. Luego, con el diálogo de alinear se puede retocar la posición del círculo.
    Puede surgir a veces un problema, y es que se muestre el trayecto así, con algunos trazos rectos donde se esperaban trazos curvos:
    En ese caso, hay que probar a editar el patrón, porque tal vez tenga algún trozo abierto. Para ello se pulsa en el botónde editar nodos en el diálogo de efectos de ruta, y se examina el patrón:
    Observa que aparece en verde porque se está editando la ruta del patrón, no la ruta principal (que aparece en rojo cuando se edita). Ahora hay que seleccionar los dos nodos superiores, y pulsar en el botón de unir nodos con un segmento:
    Ahora aparece así el trayecto que forma el patrón
    Y mientras, el aspecto final del trayecto queda así:

  • Vías de tren:
    Este caso es similar a los anteriores. Su dificultad estaría más bien en alinear los objetos. Aquí muestro el proceso seguido, aunque no se aprecian bien las diferencias. En el último paso hice una copia más pequeña, porque era un patrón demasiado grande.
    Se empieza con un rectángulo vertical largo, y otro horizontal y estrecho. Se duplica este último rectángulo, y se mueve hacia abajo y se sitúan los tres rectángulos mas o menos en sus posiciones correctas. Luego se seleccionan los tres, y se alinean al centro respecto de un eje vertical con el diálogo de alinear objetos (el botón que aparece seleccionado):

    Después se seleccionan los rectángulos horizontales (no el vertical), y se pulsa en trayecto->unión para que formen un único trayecto. Luego, se selecciona todo se alinea al centro, pero respecto de un eje horizontal (sería el botón que está justo debajo del anterior). Ya con todo bien alineado, se selecciona todo y se pulsa de nuevo en trayecto->unión para tener un solo trayecto.
    Hecho eso ya está el patrón listo, ahora solo queda copiarlo y pegarlo en rutas:


La versión 0.47 permitirá nuevas opciones, como espaciar las copias o desplazarlas respecto de la ruta original. También permitirá que el patrón que se pega esté ligado a una ruta del dibujo (visible, no oculta como hasta ahora) y que cuando se modifique, se modifique también la ruta.