25 de junio de 2007

VFPPaint - Utilitario flexible de Pintura y Dibujo con GdiPlusX

Artículo original: VFPPaint - Flexible Drawing and Paint utility with GdiPlusX
http://weblogs.foxite.com/vfpimaging/archive/2007/06/14/4033.aspx
Autor: Cesar Ch.
Traducido por: Luis María Guayán


A veces los usuarios tienen que hacer algunas modificaciones básicas en imágenes que son parte de una aplicación, y no es cómodo para ellos tener que buscar archivos, seleccionar sitios para guardar, etc.... En la gran mayoría de los casos, hacen el trabajo con MS-Paint, pero siempre lo necesitan mas personalizado ... y no pueden.

Siendo desafiado por Frank Cazabon en un hilo de Foxite, finalmente tomé el coraje para crear mi propia aplicación "Paint", usando GDI+.

VFPPaint trabaja como MSPaint, y crea un "lienzo" que permite dibujar libremente lo que se desee con el ratón.

Es apenas un solo archivo .SCX de 50 KB que hace todo el trabajo, en conjunto con la librería GdiPlusX.





IMPORTANTE
Requiere VFP9 y GdiPlusX para funcionar. 

La última versión estable de GdiPlusX es la del 11 de Mayo de 2007 (Alfa 0.8a). Por favor asegúrese que tiene la última versión, porque VFPPaint usa algunas funciones que fueron añadidas recientemente.

http://www.codeplex.com/VFPX/Wiki/View.aspx?title=GDIPlusX&referringTitle=Home

Cuando ejecute VFPPaint.SCX, le pedirá que seleccione la carpeta donde está ubicada la librería GDIPlusX.

Características:
  • Dibujar puntos, líneas, rectángulos y elipses con el ratón.
  • Escribir texto, elegir cualquier fuente, tamaño y estilo, y aparecerá en el lugar que usted haga clic en la imagen. (arrastre y suelte para elegir el mejor lugar).
  • Seleccionar cualquier color, desde la paleta o directamente de la imagen cargada o lienzo y seleccionar el ancho de pluma que quiere dibujar.
  • Seleccionar la forma o el tipo del dibujo con los botones de opciones gráficas, y luego ir al lienzo (objeto Imagen) y cliquear con el botón izquierdo del ratón.
  • Arrastrar y soltar está disponible para rectángulos, líneas y elipses.
  • Característica básica de DESHACER.
  • Rotar y voltear imágenes.
  • Cambiar el tamaño de las imágenes.
  • Imprimir y guardar imágenes
Comandos Básicos:

Cargar imagen al lienzo
Guardar imagen en el formato de imagen deseado
Imprimir imagen
Deshacer el últimos cambio
Seleccionar un color de la paleta
Seleccionar un color del lienzo
Limpiar todo el lienzo con el color seleccionado
Rotar a la izquierda
Rotar a la derecha
Voltear imagen horizontalmente
Voltear imagen verticalmente
Dibujar puntos
Dibujar rectángulo
Dibujar elipse
Dibujar línea
Rectángulo lleno
Elipse llena
Dibujar texto
Cambiar el tamaño a la imagen
Seleccionar Fuente, Tamaño y Tipo

Todas las imágenes son generadas sin acceso a disco, usando la nueva propiedad PictureVal del control Imagen. Para este caso específico, no usé el ImageCanvas que viene con GdiPlusX porque necesité un poco de personalización extra. Después de la última liberación de GdiPlusX, se consiguió que el uso de la propiedad PictureVal que tiene el objeto Imagen se hizo muy simpe, con los nuevos métodos agregados a la clase Imagen (GetPictureVal y GetPictureValfromHBitmap).

Como a veces tenemos que trabajar con una imagen que es más grande que nuestra pantalla, el lienzo del dibujo fue puesto en un formulario de nivel superior que tiene barras de desplazamiento.

Otra buena característica es la posibilidad de "DESHACER". VFPPaint almacena el mapa de bit anterior en un cache. Esto puede ser mejorado, tal vez se tiene que "deshacer" en el nivel más alto. Para esto, muy poco código será necesario.

Usando el lienzo, trate de arrastrar y soltar los objetos. Para esto, la característica "deshacer" fue muy usada, porque la forma es dibujada, y cuando el usuario mueve al ratón, se restaura la imagen original desde el buffer y se dibuja otra vez en la nueva posición.

Cuando una imagen muy grande es cargada, primero se pregunta si el lienzo tiene que ser redimensionado.



Las barras de desplazamiento aparecen en la imagen, para ayudar a recorrerla. En un primer momento, pensé en usar el muy buen control contenedor con barras de desplazamiento CTL32 de Carlos Alloatti y Malcolm Greene, pero me rendí porque necesitaba la propiedad PictureVal, que está presente sólo en el control Imagen. De este modo, hay actualmente 2 formularios en el "screenshot" de abajo. Uno es "en un formulario de nivel superior" que contiene sólo un objeto Imagen, y reside por lo general el formulario de VFPPaint. El otro formulario, es "un formulario de nivel superior". El objeto imagen "del formulario hijo" cambia su tamaño automáticamente, según las dimensiones de la imagen. Cuando este objeto es redimensionado, el formulario hijo automáticamente cambia el tamaño; y muestra y ajusta las barras de desplazamiento de ser necesario.



Ejemplo de redimensionado:



VFPPaint también permite que se pase un archivo de imagen como parámetro. De esta manera, puede abrir el formulario cargando automáticamente la imagen deseada para editar. Ejecute el formulario con:

DO FORM vfppaint WITH "eyes.gif"

Si pasa una imagen GIF como un parámetro, será automáticamente convertida a 24bpp. Esto es porque las imágenes GIFs son indexadas. Un ejemplo clásico de imágenes indexadas son las monocromáticas. Las imágenes monocromáticas puras usan sólo 1 bit por pixel. ¡De este modo, en sólo un byte usted puede almacenar la información de 8 pixeles! En el caso de GIFs, estas son por lo general 8 bits por pixel, entonces en un byte podemos tener un valor que se extiende de 0 a 255, esto es exactamente la cantidad de colores soportados por los GIFs. Lamentablemente, la versión redistribuible de GDI+ tiene una limitación trabajando con imágenes creadas en formatos de pixeles indexados, como 1bppIndexed (0x00030101), 4bppIndexed (0x00030402) y 8bppIndexed (0x00030803). Si trata de usar este tipo de imágenes, recibirá un mensaje de error cuando se crea el objeto Gráfico, que le permite usar la imagen. Mas información detallada sobre esto, la puede encontrar en el artículo: DRAWING ON GIFS OR INDEXED PIXEL FORMAT IMAGES WITH GDI+ (Nota del traductor: Este artículo se encuentra traducido en PortalFox en: Dibujar o indexar formatos de píxel a imágenes con GDI+). Por esto los GIFs son convertidos a un formato de 24bpp antes de inicializar las posibilidades de edición.

Esto aun tiene mucho que puede ser mejorado, como la adición de efectos especiales, como brillo, contraste, ajustes de tonalidad, cortar y pegar partes de la imagen, guardar y recuperar imágenes o trozos de la imagen en el portapapeles, etc.

Pero lo principal es que es totalmente configurable. Lo más importante en este formulario, es la técnica que fue usada, que verá que no hay demasiado código allí.

Esto todavía tiene que ser probado. Siéntase libre de contactarme si encuentra algún problema o tiene algunas sugerencias. Quizás algunas de sus necesidades pueden ser de interés para ser agregado a VFPPaint, y será un placer mejorarlo.

¡Cualquier comentario será bienvenido!

Descarga de VFPPaint:
http://weblogs.foxite.com/files/vfpimaging/vfppaint/vfppaint.zip

No hay comentarios. :

Publicar un comentario