12 de diciembre de 2006

La forma más fácil y rápida de crear imágenes degradadas

Artículo original: Creating Gradient Images the Fast and Easy Way
http://doughennig.blogspot.com/2007/02/creating-gradient-images-fast-and-easy.html
Autor: Doug Hennig
Traducido por: Ana María Bisbé York

He estado intentando últimamente embellecer algunos formularios. Una vía para hacer un formulario atractivo es utilizar algún elemento gráfico. En particular, me gustan las imágenes degradadas, como se ilustra en esta imagen de la pantalla (el degradado aparece vinculado a la imagen; pero no en el formulario real):



Entonces, ¿cómo crear una imagen con color degradado de los colores y tamaño deseados? Aunque yo podría hacerlo dinámicamente utilizando la biblioteca VFPX GDIPlusX, como ha descrito Cesar Ch. en varias entradas de su excelente Blog, he decidido simplemente crear un archivo imagen y emplearlo como la propiedad Picture de un objeto Image.

Con alguna ayuda del blog de Cesar, he creado un programa sencillo, CreateGradient.PRG, que genera una imagen degradada con el archivo especificado, tamaño y colores. El color se auto-explica. Tenga en cuenta que se espera que la librería de clases GDIPlus estén en la raíz de VFP.

lparameters tcFileName, ;
  tnHeight, ;
  tnWidth, ;
  tnColor1, ;
  tnColor2
local lnColor1, ;
  lnColor2, ;
  lnMode, ;
  lnFormat, ;
  loSystem, ;
  lcExt, ;
  loBitmap, ;
  loRect, ;
  loGfx, ;
  loGradBrush

* Asegúrese de que fueron pasados los parámetros.

if vartype(tcFileName) <> 'C' or empty(tcFileName) or ;
  vartype(tnHeight) <> 'N' or vartype(tnWidth) <> 'N'
  error 11
  return .F.
endif vartype(tcFileName) <> 'C' ...

* Si no se han pasado los colores, pídalos.

if pcount() < 4
  lnColor2 = getcolor(rgb( 0, 128, 255))
  lnColor1 = getcolor(rgb(255, 255, 255))
else
  lnColor1 = tnColor1
  lnColor2 = tnColor2
endif pcount() < 4

* Esto asume un degradado horizontal. 
* Configure lnMode a un valor diferente para los otros tipos.

lnMode = 0

* Crea un objeto GDIPlusX System.

loSystem = newobject('xfcSystem', 'System.vcx')
with loSystem.Drawing

  * Determina el tipo de la imagen de la extensión del archivo.

  lcExt = upper(justext(tcFileName))
  do case
    case lcExt = 'PNG'
      lnFormat = .Imaging.ImageFormat.Png
    case lcExt = 'BMP'
      lnFormat = .Imaging.ImageFormat.Bmp
    case lcExt = 'GIF'
      lnFormat = .Imaging.ImageFormat.Gif
    case inlist(lcExt, 'JPG', 'JPEG')
      lnFormat = .Imaging.ImageFormat.Jpeg
    case lcExt = 'ICO'
      lnFormat = .Imaging.ImageFormat.Icon
    case inlist(lcExt, 'TIF', 'TIFF')
      lnFormat = .Imaging.ImageFormat.Tiff
    case lcExt = 'WMF'
      lnFormat = .Imaging.ImageFormat.Wmf
    otherwise
      error 11
      return .F.
  endcase

  * Crea un objeto bitmap y un objeto rectangle del tamaño deseado.

  loBitmap = .Bitmap.New(tnWidth, tnHeight)
  loRect = .Rectangle.New(0, 0, tnWidth, tnHeight)

  * Crea un objeto graphics.

  loGfx = .Graphics.FromImage(loBitmap)
  loGfx.Clear(.Color.White)

  * Crea una brocha de degradado lineal.

  loGradBrush = .Drawing2D.LinearGradientBrush.New(loRect, ;
    .Color.FromRgb(lnColor1), .Color.FromRgb(lnColor2), lnMode)

  * Llena el rectángulo con la brocha de degradado lineal.

  loGfx.FillRectangle(loGradBrush, loRect)

  * Guarda la imagen con el archivo especificado.

  loBitmap.Save(tcFileName, lnFormat)

endwith
return

Gracias a Craig Boyd, Bo Durban, y Cesar por todo el trabajo que han hecho en esta increíble biblioteca de clases.

No hay comentarios. :

Publicar un comentario