domingo, 26 de junio de 2011

Anexo 2: convert, miniaturas en nuestro gridViewDatos

En nuestro gridviewDatos, vemos que no podemos ver totalmente las imágenes, ¿por que no hacemos pequeñas miniaturas de ellas y las podemos así ver mejor ….???? linux tiene un comandos y programas free para ello.... Manos a la obra:

El programa convert nos ayudara a reducir las imágenes cargadas al tamaño necesario para nuestro gridviews,

Instalación:

Desde la consola del sistema escribimos “convert”, si no lo tuviésemos instalado habría que instalar el programa:
$ convert
El programa «convert» puede encontrarse en los siguientes paquetes:
* imagemagick
* graphicsmagick-imagemagick-compat
Pruebe: sudo apt-get install <paquete seleccionado>
bash: convert: orden no encontrada
$ sudo apt-get install imagemagick

Nos pedirá que confirmemos la instalación del paquete , y se instalara.

Uso en nuestro programa de convert: SHELL

Una vez que hemos instalado el programa, debemos incluir el codigo que haga:
    • cada vez que introducimos o editamos un registro a la hora de rellenar el gridviewDatos, queremos que en vez de aparecer la imagen elegida, aparezca una imagen reducida (por ejemplo de 120x120 pixeles), en nuestra gridviewsdatos.
    • Desde la linea de comandos para “redimensionar” una imagen a 120x120, lo hariamos de la siguiente manera
$ convert -size 120x120 lena512.bmp -resize 120x120 +profile '*' thumbnailDD.jpg

d”De esta manera, “-size 120x120” da una idea al decodificador JPEG que la imagen se va a escalar a menor a 120x120, lo que le permite correr mas rápido, evitando el retorno de una imagen de alta resolución. El “-resize 120x120” especifica las dimensiones deseadas de la imagen de salida. Será escala por lo que su mayor dimension es de 120 pixiles. El “*” en “+profile” elimina cualquier ICM,EXIF,IPTC, o perfiles de otros que pueden estar presentes en la entrada y no son necesarios en la miniaturas.”

Al ejecutar este comenado la imagen “lena512.bmp” de 257,1 kib, la hemos convertido en otra llamada “thumbnailDD.jpg” de solo 3.7 kib.

Bien, y como lo hacemos en gambas2, pues para ello tenemos la orden “SHELL”
Crearemos un nuevo modulo al que llamaremos miniaturas,
en el insertaremos este código:


public function hacer(fichero AS String, tamano AS String) as string
DIM Proc AS process
DIM linea AS String
DIM mini AS String
'comprobar si Existe directorio de miniaturas
IF Exist("~/listin/mini") THEN
' Existe directorio de miniaturas, no necesito crearlo
ELSE
'no Existe el directorio de miniaturas, hay que crearlo...
'primero del que cuelga
MKDIR "~/listin"
'y luego en “mini”
MKDIR "~/listin/mini"
ENDIF
'nota:
'comando: file.dir(path), saca solo la ruta (sin el nombre del fichero)
'comando: file.name(path), saca solo el el nombre del archivo (sin la ruta)
mini = "~/listin/mini" & "/mini" & file.name(fichero)
IF Exist(mini) then
'Existe el archivo mini, no lo tengo que crear
RETURN mini
ELSE
'tamano puede ser 120x120, 96x96, etc
linea = "convert -size " & tamano & " " & fichero & " -resize " & tamano & " +profile '*' " & mini
proc = SHELL linea WAIT
'ejecutar el proceso y controlar el flujo de salida en tu aplicación
return mini
ENDIF
END

Notas:
1- La funcion miniaturas.hacer() ademas de realizar el redimiensionado de la imagen devuelve la ruta donde se crea esa miniatura.
2- ~/l” : el carácter ~ se reemplaza por el directorio home del usuario, indistintamente de que usuario sea, “/home/julio” o “/home/juan”.

3- Exist(): Exist("~/listin/mini"): En caso de no Existir, vamos a crear un directorio desde nuestro home/usuario, llamado listin/mini, donde de guardaran todas la miniaturas que hagamos.
Exist(mini): En caso de que Exista el archivo miniatura, no vamos a ejecutar convert

4. SHELL: esta orden ejecuta desde la linea de comando el programa convert con todos los atributos que hemos añadido (ruta del archivo, tamaño, y nombre nuevo de la miniatura)

Bien, una vez desarrollado el codigo, y creado el nuevo modulo, vamos a crear un checkbox (checkboxmini) en el formulario Fmain, para que el usuario “active o desactive” la opcion de utiliar miniaturas en el gridviewDatos, y asi modificaremos tambien la subrutina “titulo.relleno()”, para que muestre las miniaturas o los archivos originales.



Tenemos que poner en el formulario Fmain, que cuando cambie el valor del checkboxmini, se ejecute tambien la subrutina Titulos.Rellena()
PUBLIC SUB CheckBoxmini_Click()
titulo.rellena()
END


Y en el código de Titulo.Rellena():

PUBLIC SUB rellena()
DIM a AS Integer
FMain.GridViewDatos.Rows.COUNT = var.id.COUNT
FOR a = 0 TO var.id.COUNT - 1
WITH FMain
IF FMain.CheckBoxmini.Value = FALSE THEN
.GridViewDatos.Rows.height = 25
.GridViewDatos[a, 0].Picture = Picture[var.foto[a]]
ELSE
.GridViewDatos[a, 0].Alignment = 1
.GridViewDatos.Rows.height = 100
.GridViewDatos[a, 0].Picture = Picture[miniaturas.hacer(var.foto[a], "96x96")]
ENDIF
.GridViewDatos[a, 1].text = var.nombre[a]
.GridViewDatos[a, 2].text = var.apellidos[a]
....

Nota: La parte amarilla es la que se ha modificado, haciendo que cuando el checkboxmini.value=false dibuje la imagen normal, y cuando sea True realice la miniatura y dimensione la alto de la fila para que se vea la imagen.

Nota importante: En todos los sitios que se rellene el gridviewDatos, hay que añadir el mismo codigo.
Tambien en el módulo de filtrar.ConceptoFiltro, hay que hacer el mismo cambio:

…...
…...
validar = dentro(lineas, patron) AND dentro(lineas, patron1) AND dentro(lineas, patron2)
IF validar THEN
numero += 1
FMain.GridViewDatos.Rows.COUNT = numero
WITH FMain
IF FMain.CheckBoxmini.Value = FALSE THEN
.GridViewDatos.Rows.height = 25
.GridViewDatos[numero-1, 0].Picture = Picture[var.foto[a]]
ELSE
.GridViewDatos[numero-1, 0].Alignment = 1
.GridViewDatos.Rows.height = 100
.GridViewDatos[numero-1, 0].Picture = Picture[miniaturas.hacer(var.foto[a], "96x96")]
ENDIF
.GridViewDatos[numero - 1, 1].text = var.nombre[a]
…....






Aquí os pongo un ejemplo de como los registros sin y con miniaturas:



Sin miniaturas
Con miniaturas








Mucho mejor con miniaturas....¿verdad?


No hay comentarios:

Publicar un comentario