9 de marzo de 2011

Imágenes JPG, GIF, PNG y otros en dBFast

En el artículo anterior quedó claro que una de las grandes limitaciones de dBFast radica en la escasa posibilidad de manipular imágenes y que solo reconoce archivos en formato BMP.  También quedó claro que dBFast solo dispone de un set de instrucciones muy básicas para el manejo de imágenes, lo cual es una limitante a la hora de desarrollar aplicaciones que requieren un manejo gráfico más sofisticado.


Entonces las dos preguntas más recurrentes que nos hemos hecho todos en algún momento con respecto al tratamiento de imágenes son las siguientes:
  1. ¿Será posible alguna vez manipular imágenes JPG, GIF, PNG u otros formatos desde dBFast?
  2. ¿Podremos algún día manipular el tamaño de una imagen para adaptarla a una ventana?.
Hasta ahora la respuesta a estas dos preguntas ha sido un rotundo ¡NO!.  Es un hecho que dBFast no puede ni podrá manipular otro formato gráfico que no sea el tradicional BMP y esa es la triste y cruda realidad.


Sin embargo, en mis años de programador he aprendido que lo que no se puede hacer, se puede emular, y si el lenguaje de programación que utilizamos no posee la herramienta adecuada para realizar un determinado trabajo, debemos buscar una herramienta externa que nos permita hacerlo sin que el usuario lo note.  No por nada el lema de este Blog dice que "la mejor herramienta de programación es el ingenio del programador", y el segundo lema sería "no importa como se haga la implementación de una aplicación, siempre y cuando su funcionamiento sea transparente para el usuario", Y cuando no tenemos alternativas podemos utilizar este otro: "si no podemos alcanzar la eficiencia, debemos apostar por la eficacia".


Bajo estas premisas, me veo en la obligación de decirles que SI es posible manipular imágenes JPG, GIF, PNG, PCX, TIFF y muchos otros formatos desde dBFast.  No, no estoy borracho ni drogado, para ser más exacto debería decir que podemos "hacer como que" dBfast puede trabajar con otros formatos gráficos, o como mencionaba más arriba, podemos "emular" el tratamiento de otros formatos gráficos desde dBFast.


¿Y cómo hacemos semejante acto de magia?
Tal como explicaba antes, buscando una aplicación externa que haga el trabajo por dBFast sin que el usuario lo note.


¿Y cual es entonces el ingrediente mágico?
El ingrediente mágico es el programa IRFANVIEW.




IRFANVIEW es un potente, rápido, pequeño e innovador programa de edición gráfica que lleva ya varios años en el mercado, y que tiene tres grandes atributos para los programadores que trabajan en dBFast.
  1. Primero que todo, al igual que dBFast, IrfanView funciona con Windows 9x, ME, 2000, 2003, 2008, Vista y Windows 7.
  2. En segundo lugar y no menos importante para nosotros, es gratuito, aunque creo que el creador se merece con creces nuestro aporte.
  3. En tercer lugar, y lo más importante para el tema que nos interesa, es que lo podemos utilizar en modalidad de línea de comandos.

Como ven, estas tres características convierten a IRFANVIEW en el complemento ideal para delegarle el trabajo que dBFast no puede hacer.


Utilizando IRFANVIEW en modo de línea de comandos, podemos redimensionar una imagen, cambiar su formato, imprimirla, mostrar una presentación de fotografías, obtener imágenes desde un scanner y muchas cosas más que pueden ver en  la excelente página argentina dedicada a IRFANVIEW: http://iv.atspace.org/pages/hlp_command_line.html


El truco entonces resulta bastante sencillo.  Al igual que en el ejemplo del artículo anterior, podemos explorar las imágenes de una carpeta usando un arreglo y la función ADIR(), luego utilizamos IRFANVIEW para convertir la imagen seleccionada desde su formato original (JPG, GIF, PNG, etc.) en un archivo BMP temporal, y lo redimensionamos para que se ajuste al tamaño de la ventana de previsualización.  Para finalizar cargamos el BMP temporal en una variable, lo desplegamos, y ya tenemos una vista previa de un archivo que no es BMP.


Acá les dejo algunas capturas de la implementación:















A pesar de que creo que varios de ustedes ya deben conocer las bondades de IRFANVIEW, les dejo un ejemplo de su uso con dBFast.  También añado un par de opciones que permiten apreciar parte de lo que IRFANVIEW puede hacer por nosotros, y les aseguro que es difícil darse cuenta de que se está utilizando una aplicación externa para manipular las imágenes.


OBS:


El ejemplo contiene la última versión de IRFANVIEW en español más un PDF con todas las opciones y ejemplos para su uso mediante línea de comandos,  IRFANVIEW es portable por naturaleza. 

Las carpetas: BMP, GIF, JPG y PNG contienen las imágenes usadas en el ejemplo, la carpeta TMP contiene el archivo temporal que se genera para la vista previa.  Todas las demás carpetas pertenecen a IRFANVIEW.


Los Archivos PREIVIEW.PRG, PREIVIEW.OVR, SCRLIB.PRG y DESCRIP.TXT pertenecen al ejemplo, los archivos restantes pertenecen a IRFANVIEW.



Pueden descargar el ejemplo directamente desde MEGAUPLOAD




MEDIAFIRE


FILESERVE






Revísenlo y comenten.




PD:


Se ha corregido un error en la función IMGEXPLORE() detectado en el ejemplo del artículo anterior.  En dicho ejemplo, al utilizar la función IMGEXPLORE() no se mostraba la primera imagen por un error en la definición del arreglo:




Código del ejemplo anterior:




***************************************************************************************
FUNCTION IMGEXPLORE()
PARAMETERS pPath


pPath = UPPER(ALLTRIM(pPath))

**********************************************
* Traspaso de nombres de archivo a un arreglo
*
DECLARE aImages[ADIR(pPath)+1]
ADIR(pPath,@aImages)
aImages[1] = ""  // Esta instrucción reemplaza el primer elemento del arreglo que contiene el nombre de la primera imagen por una cadena vacía  ///
...




Código corregido:





***************************************************************************************
FUNCTION IMGEXPLORE()


PARAMETERS pPath


pPath = UPPER(ALLTRIM(pPath))
nPath = ADIR(pPath)


**********************************************
* Traspaso de nombres de archivo a un arreglo
*
DECLARE aRecoverFiles[ADIR(pPath)]
ADIR(pPath,@aRecoverFiles)


**********************************************
* Traspaso de Nombres de archivo al arreglo
* que se usará para la visualización de
* longitud nElementos + 1 
*
DECLARE aImages[ADIR(pPath)+1]
aImages[1] = ""
ACOPY(@aRecoverFiles,@aImages,1,nPath,2)
...

4 comentarios:

  1. Muchas gracias Rodrigo por este gran aporte, que en verdad no conocía, además de todos los anteriores.

    Por mi lado tengo una Librería muy extensa de CA-dBFast que por una parte he recopilado, y por otra he desarrollado; y que pretendo en algún momento publicarla en beneficio de toda la comunidad. Sin embargo me falta mucho tiempo para realizar todo lo que pretendo, imagina que ya no trabajo con Windows, sino con (Linux) Ubuntu 10.04 LTS (además de Joomla para Portales Web) y en una máquina virtual ejecuto Windows XP Professional sólo cuando lo necesito y me es imprescindible.

    Pero en fin, fui uno de los precursores de la Web de Usuarios CA-dBFast cuando la inicié en Agosto de 1996, época en que nos conocimos con Ramón Denuc.

    Un abrazo,



    Juan Carlos Negrete
    AlphaStation.cl/spanish/support.asp

    ResponderSuprimir
  2. Gracias Juan Carlos por tus comentarios. En realidad cuando inicié el Blog recurrí primero a ti y a Ramón por ser socios fundadores de la comunidad dBFast, de hecho, en la actualidad también estoy más dedicado al desarrollo en web que al desarrollo de aplicaciones comerciales. Actualmente trabajo en una empresa que se dedica a prestar servicios educativos a través de una plataforma web desarrollada con Visual Studio y Oracle, por lo tanto, también tengo menos tiempo del que quisiera para dedicarle al Blog y eso también explica los largos periodos de inactividad.

    Te comento que el interés por dBFast renació un día en que me llamó una antigua clienta para que modificara el sistema que alguna vez le hice en dBFast. Ahí me reencontré con este lenguaje, amor de mis inicios en la programación para Windows, y tuve que reconocer que a pesar de los años, todavía funciona sin problemas y sobre cualquier Windows.

    También me di cuenta de que aún quedan desarrolladores que trabajan con herramientas para DOS, y pensé que dBFast puede ser para ellos un buen camino en la inevitable transición hacia Windows.

    Tampoco debo dejar de reconocer la habilidad de Ramón Denuc para mantenerse vigente hasta hoy con sus aplicaciones desarrolladas íntegramente en dBFast, y por su perseverancia en mantener vigente este lenguaje.

    En fin y para no alargar, si miras el código de los programas que he publicado, podrás reconocer más de una rutina de tu autoría o de Ramón o de Stephen Field, entre otros, en algunos casos, solo he modificado un poco lo que ya estaba hecho.

    Gracias y un abrazo,


    Rodrigo Dinamarca M.

    ResponderSuprimir
  3. Hola Rodrigo,

    No dejas de sorprender con tus aportes, aunque yo había hecho algunos trabajos con los comandos del programa IRFANVIEW hace algún tiempo, nunca me imagine la cantidad de cosas que se pueden hacer con esta simple pero potente aplicación y que ayuda a que dBFast mejore substancialmente la parte gráfica que por si mismo dBFast no tiene.

    Muchas gracias Rodrigo.

    ResponderSuprimir
  4. Hola Ramón,

    La verdad es que hace tiempo busqué alternativas para la conversión de archivos con aplicaciones que soportaran el funcionamiento por línea de comandos y me encontré con IrfanView, posteriormente descargué una demo de uno de tus programas y vi que también utilizabas Irfanview, lo cual me indicó que iba por el camino correcto.

    Trataré de publicar próximamente una rutina para cargar una foto por ejemplo, para relacionarla a la ficha de un trabajador, con la posibilidad de importarla desde un archivo (JPG, GIF, PNG, BMP u otro) o bien, capturarla desde un scanner.

    Saludos y un abrazo,

    ResponderSuprimir