23 de junio de 2015

Dibujar Logos en sus imágenes con GdiPlusX

Artículo original: Draw logos in your images with GdiPlusX
http://weblogs.foxite.com/vfpimaging/archive/2007/07/11/4315.aspx
Autor: Cesar Ch.
Traducido por: Luis Maria Guayán


Otra pregunta común que encuentro siempre en algunos foros de VFP es de gente que desea dibujar algunas imágenes, generalmente logos de la compañía sobre algunas imágenes. Esto es realmente simple, como demostraré mas abajo.

Para todos los ejemplos que proporcionaré, el logo de VFPX será dibujado en algunas imágenes mas grandes. Para demostrar toda la flexibilidad que GDI+ puede ofrecernos, algunos efectos serán aplicados al logo.

IMPORTANTE

Requiere VFP9 y GdiPlusX para funcionar.

¡Por favor asegúrese que tiene la última versión!

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

EJEMPLO 1: Dibujo la imagen sin la transformación

_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx")))

WITH _SCREEN.System.Drawing as xfcDrawing

  LOCAL lcMainPict, lcLogoPict
  LOCAL loMainBmp as xfcBitmap
  LOCAL loLogoBmp as xfcBitmap
  LOCAL loGfx as xfcGraphics

  lcMainPict = GETPICT()
  lcLogoPict = GETPICT()

  loMainBmp = .Bitmap.FromFile(lcMainPict)
  loLogoBmp = .Bitmap.FromFile(lcLogoPict)
  loGfx = .Graphics.FromImage(loMainBmp)

  *!* Ejemplo 1 
  *!* Imagen Original
  *!* Posicion : Borde superior izquierdo 
  *!* Dibujo el logo sin ninguna transformación
  loGfx.DrawImage(loLogoBmp, 0, 0)
  loMainBmp.Save("c:\logo1.jpg", .Imaging.ImageFormat.Jpeg)

  * Muestro la imagen
  RUN /N explorer.exe c:\logo1.jpg
ENDWITH

EJEMPLO 2: Convierto el fondo blanco de nuestro logo a transparente usando la función Bitmap.MakeTransparent()

_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx")))

WITH _SCREEN.System.Drawing as xfcDrawing

  LOCAL lcMainPict, lcLogoPict
  LOCAL loMainBmp as xfcBitmap
  LOCAL loLogoBmp as xfcBitmap
  LOCAL loGfx as xfcGraphics

  lcMainPict = GETPICT()
  lcLogoPict = GETPICT()

  loMainBmp = .Bitmap.FromFile(lcMainPict)
  loLogoBmp = .Bitmap.FromFile(lcLogoPict)
  loGfx = .Graphics.FromImage(loMainBmp)
 
  *!* Ejemplo 2 
  *!* Convierto el color seleccionado del logo con ALPHA 255 (Opaco) a ALPHA 0 (Transparente) 
  *!* Posicion : Borde superior derecho 
  * Fuerzo al fondo blanco del logo a hacerce transparente
  loLogoBmp.MakeTransparent(.Color.White)

  * Dibujo el logo en el borde superior derecho de la imagen
  LOCAL x1, y1
  x1 = loMainBmp.Width - loLogoBmp.Width
  y1 = 0
  loGfx.DrawImage(loLogoBmp, x1, y1)
  loMainBmp.Save("c:\logo2.jpg", .Imaging.ImageFormat.Jpeg)

  RUN /N explorer.exe c:\logo2.jpg
ENDWITH

EJEMPLO 3: Dibujo el logo aplicando un 25% de transparencia a toda la imagen

La transparencia es aplicada a toda la imagen usando un ColorMatrix. La proporción de transparencia que es variedades de aplied de 0 (totalmente transparente) a 1 (totalmente opaca).

_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx")))

WITH _SCREEN.System.Drawing as xfcDrawing

  LOCAL lcMainPict, lcLogoPict
  LOCAL loMainBmp as xfcBitmap
  LOCAL loLogoBmp as xfcBitmap
  LOCAL loGfx as xfcGraphics

  lcMainPict = GETPICT()
  lcLogoPict = GETPICT()

  loMainBmp = .Bitmap.FromFile(lcMainPict)
  loLogoBmp = .Bitmap.FromFile(lcLogoPict)
  loGfx = .Graphics.FromImage(loMainBmp)

  *!* Ejemplo 3
  *!* Dibujo el logo aplicando 25% de transparencia a toda la imagen
  *!* Posicion: Borde inferior izquierdo
  * La transparencia se aplica a toda la imagen
  * Defino el porcentaje de transparencia que sera aplicado
  * Este parámetro va desde 0 (totalmente transparente) a 1 (totalmente opaco)
  LOCAL lnTranspRatio
  lnTranspRatio = 0.25 && 25%

  * Creo una matriz de color tendra la información de la transformación
  * La posición (4,4) de la matriz es la responsable de la opacidad 
  LOCAL loClrMatrix AS xfcColorMatrix
  loClrMatrix = .Imaging.ColorMatrix.New( ; 
     1, 0, 0, 0 , 0, ; 
     0, 1, 0, 0 , 0, ; 
     0, 0, 1, 0 , 0, ;
     0, 0, 0, lnTranspRatio, 0, ; 
     0, 0, 0, 0 , 0)

  * Creo un objeto de atributos de imagen para crear los efectos basados en nuestra martiz de color
  LOCAL loAttr AS xfcImageAttributes
  loAttr = .Imaging.ImageAttributes.New() 
  loAttr.SetColorMatrix(loClrMatrix)

  * Nececitamos crear un rectangulo que contendrá las coordenadas y el tamaño del logo transformado
  LOCAL loRect as xfcRectangle
  loRect = .Rectangle.New()
  loRect.X = 0 
  loRect.Y = loMainBmp.Height - loLogoBmp.Height
  loRect.Width = loLogoBmp.Width
  loRect.Height = loLogoBmp.Height 

  * Dibujo la imagen transformada usando el rectángulo y el objeto de atributos de la imagen
  loGfx.DrawImage(loLogoBmp, loRect, loLogoBmp.GetBounds(), .GraphicsUnit.Pixel, loAttr) 
  loMainBmp.Save("c:\logo3.jpg", .Imaging.ImageFormat.Jpeg)

  RUN /N explorer.exe c:\logo3.jpg
ENDWITH

EJEMPLO 4: Dibujo el logo con el fondo transparente, con una transparencia global del 50%.

Aplico 100% de transparencia al color blanco para eliminar el fondo y dibujo el logo aplicando 50% de transparencia a la imagen entera, igual que en el ejemplo anterior.

_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx")))

WITH _SCREEN.System.Drawing as xfcDrawing

  LOCAL lcMainPict, lcLogoPict
  LOCAL loMainBmp as xfcBitmap
  LOCAL loLogoBmp as xfcBitmap
  LOCAL loGfx as xfcGraphics

  lcMainPict = GETPICT()
  lcLogoPict = GETPICT()
  loMainBmp = .Bitmap.FromFile(lcMainPict)
  loLogoBmp = .Bitmap.FromFile(lcLogoPict)
  loGfx = .Graphics.FromImage(loMainBmp)
 
  *!* Ejemplo 4
  *!* Aplico 100% de transparencia a el color blanco para eliminar el fondo
  *!* Dibujo el logo aplicando 50% de transparencia a toda la imagen
  *!* Posicion: Borde superior izquierdo
  * Primer paso: Elimino el fondo blanco
  loLogoBmp.MakeTransparent(.Color.White)

  * Defino el porcentaje de transparencia que sera aplicado
  * Este parámetro va desde 0 (totalmente transparente) a 1 (totalmente opaco)
  LOCAL lnTranspRatio
  lnTranspRatio = 0.50 && 50%

  * Creo una matriz de color tendra la información de la transformación
  * La posición (4,4) de la matriz es la responsable de la opacidad 
  LOCAL loClrMatrix AS xfcColorMatrix
  loClrMatrix = .Imaging.ColorMatrix.New( ; 
     1, 0, 0, 0 , 0, ; 
     0, 1, 0, 0 , 0, ; 
     0, 0, 1, 0 , 0, ;
     0, 0, 0, lnTranspRatio, 0, ; 
     0, 0, 0, 0 , 0)

  * Creo un objeto de atributos de imagen para crear los efectos basados en nuestra martiz de color
  LOCAL loAttr AS xfcImageAttributes
  loAttr = .Imaging.ImageAttributes.New() 
  loAttr.SetColorMatrix(loClrMatrix)

  * Nececitamos crear un rectangulo que contendrá las coordenadas y el tamaño del logo transformado
  LOCAL loRect as xfcRectangle
  loRect = .Rectangle.New()
  loRect.X = 0 
  loRect.Y = 0
  loRect.Width = loLogoBmp.Width
  loRect.Height = loLogoBmp.Height 

  * Dibujo la imagen transformada usando el rectángulo y el objeto de atributos de la imagen
  loGfx.DrawImage(loLogoBmp, loRect, loLogoBmp.GetBounds(), .GraphicsUnit.Pixel, loAttr) 
  loMainBmp.Save("c:\logo4.jpg", .Imaging.ImageFormat.Jpeg)

  RUN /N explorer.exe c:\logo4.jpg
ENDWITH 

3 comentarios :

  1. Me dà error aqui:

    _SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx")))

    como solucionarlo

    ResponderBorrar
  2. Reemplazalo por: DO (LOCFILE("System.prg"))

    ResponderBorrar
  3. no existe el archivo system.vcx y no se soluciona reemplazando por DO (LOCFILE("System.prg"))

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.