12 de octubre de 2017

Como crear texto como un archivo de imagen con GdiPlusX

Artículo original: How to create text as image file with GdiPlusX
http://vfpimaging.blogspot.com/2007/11/how-to-create-text-as-image-file-with.html
Autor: Cesar Ch.
Traducido por: Luis María Guayán


Más que una vez que he visto a la gente pedir como crear imágenes que contengan algún texto. El ejemplo de abajo es realmente muy simple.
  • Crear una fuente
  • Medir el espacio que el texto necesitará
  • Crear una imagen con el tamaño necesario
  • Dibujar el texto
  • Guardar en el disco
IMPORTANTANTE
Para ejecutar se requiere VFP9 y GdiPlusX.
Por favor, asegúrese de que tiene la última versión, porque VFPPaint utiliza algunas de las funciones que se han añadido recientemente.
https://github.com/VFPX/GDIPlusX
DO LOCFILE("System.app")

WITH _SCREEN.SYSTEM.Drawing
  LOCAL lcText
  lcText = "GdiPlusX is Cool !!!"

  * Crear una fuante
  LOCAL loFont AS xfcFont
  loFont = _SCREEN.SYSTEM.Drawing.FONT.New("Verdana", 32, .FontStyle.BoldItalic)

  LOCAL loTmpBmp AS xfcBitmap
  loTmpBmp = .BITMAP.New(1,1)

  * Recuperar el objeto gráfico
  LOCAL loTmpGfx AS xfcGraphics
  loTmpGfx = .Graphics.FromImage(loTmpBmp)

  * Medir la cadena
  * tomar el tamaño necesario para el texto
  LOCAL loSize AS xfcSize
  loSize = loTmpGfx.MeasureString(lcText, loFont)

  LOCAL loNewBmp AS xfcBitmap
  loNewBmp = .BITMAP.New(CEILING(loSize.WIDTH),CEILING(loSize.HEIGHT))

  LOCAL loNewGfx AS xfcGraphics
  loNewGfx = .Graphics.FromImage(loNewBmp)

  * Hacer el fondo amarillo
  loNewGfx.CLEAR(.COLOR.Yellow)

  * Crear un pincel sólido
  LOCAL loBrush AS xfcSolidBrush
  loBrush = .SolidBrush.New(.COLOR.FromRGB(255,0,0)) && Rojo

  * Crear un objeto StringFormat para dibujar el texto centrado en la imagen
  LOCAL loStringFmt AS xfcStringFormat
  loStringFmt = .StringFormat.New()
  loStringFmt.ALIGNMENT = .StringAlignment.CENTER

  * Crear un ractángulo con las medidas del Bitmap
  LOCAL loRect AS xfcRectangleF
  loRect = loNewBmp.GetBounds()

  * Dibujar la cadena
  loNewGfx.DrawString(lcText, loFont, loBrush, loRect, loStringFmt)

  * Finalmente guardar la imagen
  lcImage = ADDBS(GETENV("TEMP"))+"MyText.Png"
  loNewBmp.SAVE(lcImage, .Imaging.ImageFormat.Png)

  * Mostrar la imagen
  DECLARE INTEGER ShellExecute IN shell32.DLL ;
    INTEGER hndWin, STRING cAction, STRING cFileName, ;
    STRING cParams, STRING cDir, INTEGER nShowWin
    
  ? ShellExecute(0, "Open", lcImage , "", "", 1)

ENDWITH


7 comentarios :

  1. Buen día. Muchas gracias por esto. Hasta ahora no pude hacerlo andar.
    loSize = loTmpGfx.MeasureString(lcText, loFont)
    Me dice que loTmpGfx no es un objeto

    ResponderBorrar
  2. Hola. A mí me dice:
    La propiedad "Ceiling" no se encuentra. Tengo VFP9...7423.

    LOCAL loNewBmp as xfcBitmap
    loNewBmp = .Bitmap.New(loSize.Ceiling)

    Le doy Cancelar. Y si vuelvo a ejecutar, me aparece el error que dice anónimo.

    ResponderBorrar
    Respuestas
    1. Ceiling es un método, no una propiedad. Ya está corregido en el artículo.

      Gracias por el aviso.

      Borrar
  3. Luis. Quiero comprender esto mejor....Creo un .prg y adiciono el codigo tuyo.... pero genera errores. GRACIAS por tu ayuda.

    ResponderBorrar
  4. lUIS Maria. Puedes colaborar, ya que ESTA linea. Continua sacando error. loNewBmp = .Bitmap.New(loSize.Ceiling())

    ResponderBorrar

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