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.

jueves, 23 de octubre de 2008

Cuerpos 3D: cilindros semitransparente

Un par de casos más: Un cilindro de pared delgada y otro transparente.
El de pared delgada no tiene ningún misterio, basta que la circunferencia superior esté rellena con un degradado, con lo que no hace falta duplicarla y reducirla de tamaño como en casos anteriores.

Un cilindro semitransparente es más complejo. Las paredes tienen que tener la forma correcta, no vale el truco de antes de dejar que algunas figuras tengan zonas mal dibujadas, pero que como quedan por debajo de otras figuras no se retocan.

En este caso, las paredes tienen que tener la forma similar a la que se ve en la figura del medio. Es algo fácil con una rejilla, la opción de ajustar a la rejilla los nodos y las cajas de contorno, y un par de elipses. Se empezaría con el rectángulo, y se le añade una elipse en la parte superior (en mi caso la morada), se duplica la elipse y se sitúa abajo (en mi caso la verde). Luego se duplican todas estas figuras (2 elipses y un rectángulo para la cara superior, y otros tantos para la inferior).

Para la pared trasera se sumarían la elipse superior y el rectángulo, y se restaría la inferior. La figura resultante está completa, así que se envía al fondo. Al enviar estas figuras al fondo, aparecen las que formarán la cara frontal. Pero antes de hacer esta cara, conviene duplicar la elipse inferior, darla el color adecuado y enviarla al fondo, ya que formará la cara inferior del cilindro. Por supuesto, este paso es innecesario si no se pone una cara inferior.

Luego, con las figuras que hay, se hace la cara frontal: primero se resta la elipse superior del rectángulo, y se le suma la elipse inferior. Hecho esto, solo falta dar los colores y transparencias adecuadas al cilindro.


En mi caso no añado una tapa superior, puesto que dibujo el cilindro abierto por arriba, como si fuera un vaso.

jueves, 16 de octubre de 2008

Cuerpos 3D: cilindros anchos y huecos

En el caso de dibujar un cilindro bajo y hueco aparece un nuevo detalle: el cilindro debe dejar ver el fondo a través de si mismo. Esto significa que el truco de poner un círculo más pequeño con un degradado sobre la base superior ya no funciona.

En este caso hay que agujerear la tapa, y añadir una nueva figura que haga de pared interna, que tenga forma circular debajo. Además, hay que modificar la figura que hace el cuerpo del cilindro para que no tape el agujero.

En este caso se parte de un cilindro ya hecho que es muy bajo (el de la primera figura de la imágen de abajo con el proceso). Lo primero que se hace es duplicar la elipse que forma la tapa del cilindro (base superior), y se le aplica un factor de reducción de un 80% aproximadamente. Esto se hace con el menú objeto->escalar y dentro de la ventana se pulsa limpiar, y se mete 80. Para distinguir esta nueva elipse, es conveniente darla otro color (en mi caso usé magenta). Así quedaría como en la segunda figura.

Luego, se vuelve a duplicar la elipse que hace tapa, y se deplaza hasta alinearla con la base del cilindro. Esto es sencillo seleccionándo la elipse y el cuerpo del cilindro y con la diálogo de alineación (objeto->alinear y distribuir), se selecciona "Elemento mayor", y se pulsa el botón resaltado en la imágen:

Una vez alineado, se le reduce de tamaño como la otra elipse (la morada). En mi caso, la pongo de naranja para distinguirla. Al final se tiene como la tercera figura.

Luego, con la herramienta de rutas hay que hacer una ruta (trayecto) con lineas rectas que vaya por fuera de la circunferencia elipse (en mi caso morada), y por dentro de la tapa del cilindro (si se sale por abajo no pasa nada). En mi caso hago esta ruta de color verde para distinguirla de los otros objetos. Luego, hay que situarla por debajo de las dos elipses nuevas. Quedaría más o menos como se ve en la figura cuarta.

La versión 0.47 de Inkscape trae un botón para forzar a hacer lineas rectas, que aparece en la barra de herramientas con las opciones de las herramientas:

Luego vienen las restas: Se selecciona la elipse que forma la tapa del cilindro, y la elipse pequeña de arriba (en mi caso la de color magenta) y se pulsa en trayecto->diferencia. Quedaría la tapa del cilindro con un agujero (que no se ve con la ruta verde, pero sería la sexta figura).

Luego se selecciona la ruta nueva (que en mi caso es de color verde) y la elipse inferior (la que es naranja), y se pulsa en trayecto->diferencia para recortarla y que quede como en la sexta figura. Ahora hay que mandar esta ruta al fondo (figura 7).

Ahora aparece por ahí la figura que forma parte del cuerpo del cilindro, que ahora se ve a través del agujero. Hay dos opciones, recortarla con una ruta nueva y usando "trayecto->diferencia", o editarla para que quede bajo la tapa que forma el cilindro. Aquí se ve por dónde puede ir la ruta (por supuesto, no tiene que ser algo exacto, con que no se vea por el agujero de la tapa ni queden huecos en el cuerpo del cilindro basta):

Para ello, se usa la herramienta de editar nodos (doble clic en la ruta), se selecciona el segmento superior de la ruta, y se pulsa en añadir nodo:

Luego se mueve este nodo hacia abajo, hasta que quede bien. Como es normal, es posible que se necesiten más nodos, para ello se puede añadir nodos nuevos, se selecciona el segmento y se pulsa en añadir nodos. Puede ser útil llevar esta ruta al frente para editarla y luego volverla a dejar al fondo.



En principio ya está el cilindro, solo queda ajustar bien el degradado de la ruta que en mi caso era verde. La herramienta de rutas y tener un buen ojo bastan para terminar el cilindro. La tecla control permite hacer que la linea que define el degradado quede totalmente horizontal.

miércoles, 15 de octubre de 2008

Cuerpos 3D: como dibujar cilindros

Inkscape no es un programa 3D, pero permite crear fácilmente cuerpos geométricos.

Este tutorial explica como se pueden crear cuerpos cilíndricos fácilmente, usando operaciones boleanas sencillas y el autoajuste a la rejilla.

En este tipo de dibujos es útil usar la rejilla, y las opciones para ajustar los nodos según se dibuja. También hay que tener en cuenta el punto de vista y la iluminación. El punto de vista es desde donde se vería el cuerpo, y la iluminación determinará los colores y degradados a aplicar. Si se dibujan varios cuerpos geométricos es importante dibujarles todos con el mismo punto de vista y iluminación para que quede bien.

Se empieza haciendo un rectángulo (primera figura), y a continación una elipse en la parte superior. Esta elipse debe estar "achatada", es decir, ser más ancha que alta. Cuánto más bajo sea el punto de vista desde donde se vería la elipse, más achatada hay que dibujarla. Es importante que la elipse tenga el mismo ancho que el rectángulo, y que su eje horizontal coincida con el lado superior del rectángulo. Gracias a la rejilla, esto es bastante sencillo. En la segunda figura se ve como iría quedando, si se añade la elipse inferior que se añadirá en el siguente paso.

Después, se duplica esa elipse y se sitúa la copia en la parte inferior del rectángulo, para que su eje horizontal coincida con el lado inferior del rectángulo (segunda figura). Si se dan colores diferentes es más fácil diferenciar los elementos al dibujarlos. La elipse superior hay que llevarla al frente, para ello se selecciona y se pulsa la tecla inicio del teclado, o se puede pulsar en el icono de la barra de herramientas: Ahora se selecciona la elipse inferior y el rectángulo, y se pulsa en trayecto->unión , para unir estas figuras y formar el cuerpo del cilindro. El resultado ya se parece a un cilindro, pero un degradado ayudará bastante a tener un buen resultado. En la tercera figura se ve el resultado.

Este degradado se puede realizar con la herramienta de degradados, hay seleccionar un degradado lineal y hay que trazarlo en horizontal (la rejilla puede ayudar). Para que quede el aspecto que se ve (una banda brillante), hay que hacer que el color del nodo de la izquierda tenga el color del cilindro, y el de la derecha sea un poco más oscuro (está un poco a la sombra). Además, para hacer el brillo hay que añadir un nodo en el medio. Se puede hacer pulsando la tecla control y haciendo doble clic. Este nodo debe tener un tono más claro que el del cilindro. Para terminar este degradado, hay que hacer coincidir el nodo izquierdo con el borde del objeto, y el derecho tiene que estar un poco fuera de la pared del cilindro.


Estas indicaciones son orientativas, puesto que dependen mucho del autor y sus habilidades.

El cilindro ya está. Si se quiere hacer que sea hueco, basta con seleccionar la elipse superior, duplicarla y reducirla de tamaño. Esto se puede hacer fácilmente con una transformación, para ello se va al menú objeto->transformar, se pulsa en limpiar, y dentro de la pestaña escalar se mete un factor de 80% (o el valor que mejor venga) en las dos direcciones y se pulsa aceptar. Luego se añade un degradado a esta elipse teniendo en cuenta que la parte brillante queda en una zona diferente que la parte exterior del cilindro. En el ejemplo mío sería la quinta figura.

Ya está el cilindro hueco, pero si se le quiere añadir más detalles, se puede. Por ejemplo, se puede añadir una banda lateral, para eso basta con duplicar la elipse superior, y llevarla hasta una altura intermedia, volverla a duplicar y desplazarla un poco en vertical (como se ve en la sexta figura). Luego, se añade un rectángulo cuyos lados coincidan con los ejes horizontales de las elipses (rectángulo rosa de la séptima figura).

Con operaciones boleanas se hace saca la forma: Primero se selecciona la elipse inferior (naranja en mi ejemplo) y el rectángulo, y se pulsa en trayecto->unión. Luego, se selecciona la elipse superior, y se lleva al frente (octava figura) y luego se selecciona la figura obtenida de juntar la circunferencia y el rectángulo (de color naranja). Con estas dos figuras seleccionadas se pulsa en trayecto->diferencia, para que la elpse roja "reste" su forma a la figura naranja. El resultado se fe en la figura 9. Se rellena con un degradado similar al resto del cilindro, y quedaría como la figura 10.


¿Se puede avanzar más? Si, se puede añadir un reflejo estilo 2.0 y un poco de sombra hacia atrás. El reflejo es simple: basta duplicar el cuerpo del cilindro, moverle hacia abajo y modificar los colores (mejor que yo, a ser posible, que me quedó un poco mal). Con la banda, algo parecido. La sombra me costó más: al final usé el efecto "motion" (efectos->generar desde el trayecto->motion) con una copia de la elipse superior. Este efecto tiene dos parámetros, un ángulo y una longitud. La longitud va en píxeles, y el ángulo en grados. Es importante tener en cuenta que 0º es a la derecha, 90º es hacia abajo, 180 es hacia la derecha y 270 hacia arriba. En mi caso usé 240º. Este efecto está bien, pero tiene el defecto de producir muchas rutas que deben ser combinadas entre si antes de darlas un tono semitransparente. Estas rutas se crean dentro de un grupo nuevo. Una vez combinadas las rutas, se sitúan en la posición correcta, y se rellenan de un tono semitransparente mejor que el que le di, que no parece que quede bien.