14 de marzo de 2008

Convierta sus botones en BMPs con transparencia con GdiPlus

Artículo original: Convert your buttons to BMPs keeping transparency with GdiPlusX
http://weblogs.foxite.com/vfpimaging/archive/2007/11/14/5404.aspx
Autor: Cesar Ch. (http://weblogs.foxite.com/vfpimaging)
Traducido por: Ana María Bisbé York (amby@telefonica.net)
Para: PortalFox (http://www.portalfox.com)


La siguiente función convierte cualquier imagen de botón en BMP para ser utilizado en formularios VFP.

Existen muchos iconos gratis y disponibles en la red; pero la gran mayoría tienen formatos ICO, GIF o PNG, que no son muy fiables para ser utilizadas en VFP. Para nosotros, el mejor formato de imagen, por muchas razones, es el formato BMP.

Son necesarias algunas transformaciones para hacer que este BMP muestre exactamente cómo que se desea, especialmente cuando convierte algunas imágenes originales en formato PNG, GIF o ICO.
VFP muestra el blanco puro - RGB(255,255,255) como transparente en nuestros botones y objetos image. El código que se muestra a continuación, convierte primero el blanco original a RGB(254,254,254) que visualmente es lo mismo; pero no se vuelve transparente y elimina la necesidad de crear una máscara de imagen (MSK) y además, convierte el color de fondo del bitmap original en blanco puro, lo que provocará que se muestre transparente en formularios VFP.

Para más detalles compruebe, por favor, estos escritos:

BMPs with Transparent Backgrounds
How to put one image over another in a form

IMPORTANTE

Necesita VFP9 y GdiPlusX para ejecutarlo

Asegúrese de que tiene la última versión, debido a que este ejemplo puede estar utilizando algunas funciones que hemos agregados o reparado recientemente.

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

Guarde el programa siguiente como BUTTON2BMP.PRG  y llámelo de esta forma:
Button2Bmp(GETPICT(), "c:\NewIcon.bmp")
Cuando compile este programa en su ejecutable, no olvide, por favor, quitar el comando LOCFILE(), en su lugar, emplee: Do System.prg
LPARAMETERS tcSourceFile, tcDestFile

DO LOCFILE("System.prg")
 
LOCAL loBmp AS xfcBitmap
LOCAL loGfx AS xfcGraphics
LOCAL loBorderClr AS xfcColor
LOCAL loRect AS xfcRectangle
LOCAL loAttr AS xfcImageAttributes
LOCAL loColorMap AS xfcColorMap
 
WITH _SCREEN.SYSTEM.Drawing
   loColorMap = .Imaging.ColorMap.New()
   loAttr = .Imaging.ImageAttributes.New()
   loBmp = .Bitmap.FromFile(tcSourceFile)
   loGfx = .Graphics.FromImage(loBmp)
   loRect = loBmp.GetBounds()

   * Toma el color del pixel que está más arriba a la izquierda, 
   * asumiendo que este color es el color de fondo BackGround para volverlo transparente
   * Para nuestro BMP, será BLANCO PURO  - RGB(255,255,255)
   * que se convierte en transparente en objetos VFP 
   loBorderClr = loBmp.GetPixel(0,0)
 
   * Convierte los blancos originales RGB(255,255,255) a OFF WHITE - RGB(254,254,254)
   * de esta forma, los blancos se mantendrán, sin necesidad de máscara
   loColorMap.OldColor = .Color.White
   loColorMap.NewColor = .Color.FromARGB(255,254,254,254)
   
   loAttr.SetRemapTable(loColorMap)
   loGfx.DrawImage(loBmp, loRect, loRect, .GraphicsUnit.Pixel, loAttr)
 
   * El siguiente paso, convertir los bordes en blanco puro, RGB(255,255,255) 
   * que lo convertirá en transparente en los botones.
   loColorMap.OldColor = loBorderClr
   loColorMap.NewColor = .Color.White
   loAttr.SetRemapTable(loColorMap)
   loGfx.DrawImage(loBmp, m.loRect, m.loRect, .GraphicsUnit.Pixel, loAttr)
 
   loBmp.Save(tcDestFile, .Imaging.ImageFormat.Bmp)
ENDWITH

No hay comentarios. :

Publicar un comentario