Mostrando las entradas con la etiqueta VFPx. Mostrar todas las entradas
Mostrando las entradas con la etiqueta VFPx. Mostrar todas las entradas

30 de julio de 2021

Capturando pantallas con GdiPlus-X

Artículo original: CAPTURING SCREENS WITH GDIPLUS-X
Autor: Cesar Ch.
Traducido por: Luis María Guayán


Capturar una pantalla con Gdiplus-X es una tarea muy fácil también.

Básicamente todo lo que tenemos que hacer, es llamar al método FromScreen() de la clase de Bitmap. Para facilitar esta tarea, este método brinda diferentes posibilidades.

IMPORTANTE:

Todas los ejemplos siguientes utilizan la nueva librería GDIPlus-X, que está todavía en la versión ALFA, pero es estable y confiable para hacer la mayoría de las tareas de GDI+. Descargue la última versión estable de VFPx:

https://github.com/VFPX/GDIPlusX

1 - Capturar una pantalla de un Formulario enviando el hWnd del formulario o el formulario como un objeto

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

LOCAL loCaptureBmp AS xfcBitmap
WITH _Screen.System.Drawing
   loCaptureBmp = .Bitmap.FromScreen(Thisform.HWnd)
   * Could be also:
   * loCaptureBmp = _screen.system.Drawing.Bitmap.FromScreen(Thisform)
   loCaptureBmp.Save("c:\Captured.png", .Imaging.ImageFormat.Png)
ENDWITH

2 - Capturar la pantalla entera

En este caso no es necesario pasar parámetros

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

LOCAL loCaptureBmp AS xfcBitmap
WITH _Screen.System.Drawing
   loCaptureBmp = .Bitmap.FromScreen()
   loCaptureBmp.Save("c:\CapturedScreen.png", .Imaging.ImageFormat.Png)
ENDWITH

3 - Capturar la pantalla de un formulario recortando sus bordes y título.

Para esta tarea utilizamos la función SYSMETRIC() para obtener la medida de los elementos de la pantalla, tales como la altura del título, borde superior e izquierdo. Entonces utilizamos otra posibilidad, enviando el hWnd, y las coordenadas del formulario que será capturado.

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

LOCAL lnTitleHeight, lnLeftBorder, lnTopBorder
lnTitleHeight = SYSMETRIC(9)
lnLeftBorder = SYSMETRIC(3)
lnTopBorder = SYSMETRIC(4)

LOCAL loCaptureBmp AS xfcBitmap


WITH _Screen.System.Drawing
   loCaptureBmp = .Bitmap.FromScreen(;
      Thisform.HWnd, ;
      lnLeftBorder, ;
      lnTitleHeight + lnTopBorder, ;
      Thisform.Width, ;
      Thisform.Height)

   loCaptureBmp.Save("c:\Captured.png", .Imaging.ImageFormat.Png)
ENDWITH

4 - Capturar todos los formularios de la pantalla

Esto también es muy fácil. Sólo cree un ciclo por todas los formularios de _Screen, y capture cada uno de ellos enviando el Form.hWnd como parámetro.

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

LOCAL loCaptureBmp AS xfcBitmap
LOCAL n
LOCAL loForm AS Form
n = 1

WITH _Screen.System.Drawing

FOR EACH loForm IN _Screen.Forms
   loCaptureBmp = .Bitmap.FromScreen(loForm.HWnd)
   loCaptureBmp.Save("c:\CapturedForm" + TRANSFORM(n) + ".png", .Imaging.ImageFormat.Png)
   n = n + 1
ENDFOR

ENDWITH

16 de julio de 2021

Información de imágenes con GDI+

Artículo original: Image Info with GdiPlus X
http://vfpimaging.blogspot.com/2007/04/image-info-with-gdiplus-x.html
Autor: Cesar Ch
Traducido por: Ana María Bisbé York


Otra sencilla tarea para GDI+

Para obtener alguna información básica de imágenes, tal como, Ancho, Alto, Resolución y Formato de pixeles, todo lo que necesitamos es Iniciar un objeto Image de GDI+ y tomar algunos valores de las propiedades, como se muestra debajo.

IMPORTANTE:

Todos los ejemplos que se muestran a continuación utilizan la nueva biblioteca GDIPlus-X, que está aún en versión ALPHA, pero es realmente estable y fiable para hacer la gran mayoría de las tareas de GDI+. Descargue la versión más estable de VFPx:

https://github.com/VFPX/GDIPlusX

Image Properties

LOCAL lcImage
lcImage = GETPICT()
IF EMPTY(lcImage)
  RETURN
ENDIF
_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx")))
LOCAL loImg AS xfcImage
WITH _SCREEN.System.Drawing
  loImg = .Image.FromFile(lcImage)
    IF ISNULL(loImg)
      MESSAGEBOX("No se pudo cargar el archivo imagen")
      RETURN 
    ENDIF
  * Obtener el nombre de formato de pixeles (PixelFormat )
  LOCAL lnPix, lcPixFormat
  lnPix = loImg.PixelFormat 
  DO CASE 
    CASE lnPix = .Imaging.PixelFormat.Format1bppIndexed 
      lcPixFormat = "1bppIndexed"
    CASE lnPix = .Imaging.PixelFormat.Format4bppIndexed 
      lcPixFormat = "4bppIndexed"
    CASE lnPix = .Imaging.PixelFormat.Format8bppIndexed 
      lcPixFormat = "8bppIndexed"
    CASE lnPix = .Imaging.PixelFormat.Format16bppGrayScale
      lcPixFormat = "16bppGrayScale"
    CASE lnPix = .Imaging.PixelFormat.Format16bppRGB555
      lcPixFormat = "16bppRGB555"
    CASE lnPix = .Imaging.PixelFormat.Format16bppRGB565
      lcPixFormat = "16bppRGB565"
    CASE lnPix = .Imaging.PixelFormat.Format16bppARGB1555
      lcPixFormat = "16bppARGB1555"
    CASE lnPix = .Imaging.PixelFormat.Format24bppRGB
      lcPixFormat = "24bppRGB"
    CASE lnPix = .Imaging.PixelFormat.Format32bppRGB
      lcPixFormat = "32bppRGB"
    CASE lnPix = .Imaging.PixelFormat.Format32bppARGB
      lcPixFormat = "32bppARGB"
    CASE lnPix = .Imaging.PixelFormat.Format32bppPARGB
      lcPixFormat = "32bppPARGB"
    CASE lnPix = .Imaging.PixelFormat.Format48bppRGB
      lcPixFormat = "48bppRGB"
    CASE lnPix = .Imaging.PixelFormat.Format64bppPARGB
      lcPixFormat = "64bppPARGB"
    OTHERWISE 
      lcPixFormat = "No identificado"
  ENDCASE
ENDWITH

LOCAL lcInfo
lcInfo = ;
  "Ancho : " + TRANSFORM(loImg.Width) + SPACE(25) +;
  "Alto : " + TRANSFORM(loImg.Height) + CHR(13) +;
  "Resolución - Vertical : " + TRANSFORM(loImg.VerticalResolution) + SPACE(6) +;
  "Horizontal : " + TRANSFORM(loImg.HorizontalResolution) + CHR(13) +;
  "Formato de pixeles : " + lcPixFormat
MESSAGEBOX(lcInfo, 64, "Propiedades de imagen para " + JUSTFNAME(lcImage))

16 de junio de 2021

Rotar y voltear imágenes con GdiPlusX

Artículo original: Rotate and Flip images with GdiPlusX
https://vfpimaging.blogspot.com/2007/06/vfppaint-flexible-drawing-and-paint.html
Autor: Cesar Ch.
Traducido por: Ana María Bisbé York


Alguna gente ha estado preguntando sobre Rotar/ Voltear imágenes con GdiPlusX.

He aquí un código adaptado de un artículo anterior que utilizaba _GdiPlus.vcx; pero esta vez utilizando GdiPlusX.

Rotar y/o voltear imágenes es una tarea muy sencilla para Gdi+. Para ver los diferentes resultados posibles, cambie el valor de la constante en la variable lnEnumRotateFlip del código que se muestra a continuación.

IMPORTANTE

Requiere VFP9 y GdiPlusX para ejecutarse

Asegúrese por favor de que tiene la última versión

https://github.com/VFPX/GDIPlusX

* Iniciar GdiPlusX
_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx","vcx")))
LOCAL loBMP as xfcBitmap
LOCAL lnEnumRotateFlip
WITH _SCREEN.System.Drawing
  loBMP = .Bitmap.FromFile(GETPICT())
  * Pruebe cambiando este valor por los que se muestran debajo 
  lnEnumRotateFlip = .RotateFlipType.Rotate90FlipNone 
  loBmp.RotateFlip(lnEnumRotateFlip)
  * Guardar la imagen como PNG 
  loBMP.Save("C:\RotateFlip.png", .Imaging.ImageFormat.Png)
ENDWITH 
RUN /N explorer.EXE RotateFlip.png 

RotateNoneFlipNone 0

RotateNoneFlipNone 1

RotateNoneFlipNone 2

RotateNoneFlipNone 3

RotateNoneFlipNone 4

RotateNoneFlipNone 5

RotateNoneFlipNone 6

RotateNoneFlipNone 7


17 de noviembre de 2020

Códigos QR con FoxBarcodeQR v.2.25 (última version)

Actualización del 30/07/2025: Se libera una nueva versión v.2.25 de FoxBarcodeQR


FoxBarcodeQR es una clase libre que ofrece una solución alternativa para todos los desarrolladores de la comunidad de Visual FoxPro que solicitaron soporte para Códigos QR a la clase FoxBarcode

Ambas clases forman parte del proyecto VFPx:

FoxBarcodeQR utiliza las librerías:

Características de las librerías externas


BarCodeLibrary.dll 

  • Genera códigos QR  funcionales, pero sólo se puede establecer el tamaño y el tipo de la imagen generada. 
  • No tiene ajustes para el nivel de corrección de errores, colores y/o margenes.
  • No soporta cadenas de mas de 255 caracteres.

La librería BarCodeLibrary.dll contiene solo 3 funciones:

  • LibraryVersion: Retorna una cadena con la versión de la librería.
  • SetConfiguration: Método para establecer el tamaño y el tipo de archivo de imagen a generar.
  • GenerateFile: Método responsable de generar la imagen del código de barras QR.

QRCodeLib.dll  (versión 0.1b - www.validacfd.com)

  • Genera códigos QR funcionales con un mayor control de configuración.
  • Soporta cadenas de mas de 255 caracteres.

La librería BarCodeLib.dll contiene los métodos:

  • QRCodeLibVer: Retorna una cadena con la versión de la librería.
  • FastQRCode: Genera la imagen del código de barras QR con el texto a codificar.
  • FullQRCode: Igual que el método anterior, pero con mayor control en la generación de la imagen del código QR.
La API de Google genera códigos QR  a través de una llamada POST a una URL:
  • Requiere conexión a internet.
  • Soporta cadenas de mas de 255 caracteres.

Métodos de FoxBarcodeQR

FoxBarcodeQR encapsula las funciones de las librerías BarCodeLibrary.dllQRCodeLib.dll y la API de Google, en métodos propios de la clase para compatibilidad con las versiones anteriores y poder seleccionar la librería a utilizar .

Los métodos de la clase FoxBarcodeQR son: 

  • QRBarcodeImage() que utiliza la librería BarCodeLibrary.dll y que recibe los siguientes parámetros:
    • tcText: Texto para codificar
    • tcFile: Nombre del archivo de imagen que desea generar. Si no se especifica ninguno, se genera un nombre de archivo aleatorio en la carpeta de archivos temporales de Windows.
    • tnSize: El tamaño de la imagen generada. Recibe un número entero entre 2 y 12
      • 2 = 66 x 66 (en píxeles)
      • 3 = 99 x 99
      • 4 = 132 x 132
      • 5 = 165 x 165
      • 6 = 198 x 198
      • 7 = 231 x 231
      • 8 = 264 x 264
      • 9 = 297 x 297
      • 10 = 330 x 330
      • 11 = 363 x 363
      • 12 = 396 x 396
    •  tnType: El tipo de archivo de imagen generado. Recibe un número entero entre 0 y 2.
      • 0 = BMP
      • 1 = JPG
      • 2 = PNG

A partir de la versión 2.0 de FoxBarcodeQR, los nuevos métodos añadidos utilizan la librería QRCodeLib.dll v.01b (www.validacfd.com)

  • FullQRCodeImage() que recibe los mismos parámetros que QRBarcodeImage()
    •  tcText: Texto para codificar
    • tcFile: Nombre del archivo de imagen que desea generar. Si no se especifica ninguno, se genera un nombre de archivo aleatorio en la carpeta de archivos temporales de Windows.
    • tnSize: El ancho y alto en pixeles de la imagen generada
    • tnType: (solo por compatibilidad) La librería solo genera archivo de imagen tipo 0 = BMP

Para configurar las otras opciones se utilizan las siguientes propiedades:

    • lAutoConfigurate: .T. para seleccionar una versión de código QR más grande si la cantidad de datos lo requiere.
    • lAutoFit: Trabaja conjuntamente con lAutoConfigurate
    • nBackColor: Color del fondo del código QR
    • nBarColor: Color de las barras del código QR
    • nCorrectionLevel: Nivel de corrección  de errores :
      • 0 = Nivel L ( 7 % ) 
      • 1 = Nivel M  ( 15 % ) 
      • 2 = Nivel Q ( 25% ) 
      • 3= Nivel H ( 30% )  
    • nEncoding: Algoritmo de codificación:
      • 0 = Alfabético: Codifica caracteres alfanuméricos  (digitos 0-9;  mayúsculas A-Z;  otros nueve caracteres: Espacio $ % * + – . / : )
      • 1 = Byte = 1: Codifica valores binarios ( 8-bit data) 
      • 2 = Numérico: Codifica unicamente valores numéricos (digitos 0-9) 
      • 3 = Kanji: Codifica caracteres Kanji. Los caracteres Kanji en Código QR pueden tener valores 8140-9FFC y E040-EBBF 
      • 4 = Auto:  Selección automática del algoritmo de codificación. (Recomendado)
    • nMarginPixels: Margen en pixeles
    • nModuleWidth: Tamaño de los módulos en pixeles
    • nHeight: Alto de la imagen en pixeles
    • nWidth: Ancho de la imagen en pixeles
  • FastQRCodeImage() es igual que el método FullQRCodeImage() y solo se pasa el texto a codificar. El resto se configura automáticamente, sin ningún control del usuario. 
    •  tcText: Texto para codificar
    •  tcFile: Nombre del archivo de imagen que desea generar. Si no se especifica ninguno, se genera un nombre de archivo aleatorio en la carpeta de archivos temporales de Windows.
  • GooQRCodeImage()  recibe los mismos parámetros que los métodos anteriores para uniformar la clase:
    •  tcText: Texto para codificar
    •  tcFile: Nombre del archivo de imagen que desea generar. Si no se especifica ninguno, se genera un nombre de archivo aleatorio en la carpeta de archivos temporales de Windows.
    •  tnSize: El ancho y alto en pixeles de la imagen generada
    • tnType: (solo por compatibilidad) La API solo genera archivo de imagen tipo 2 = PNG

        Esta API nos permite ajustar algunas otras propiedades como:

    •     nCorrectionLevel: Nivel de corrección  de errores :
      • 0 = Nivel L ( 7 % ) 
      • 1 = Nivel M  ( 15 % ) 
      • 2 = Nivel Q ( 25% ) 
      • 3= Nivel H ( 30% )  
    • nMarginPixels: Margen en columnas

  • SvrQRCodeImage()  recibe los mismos parámetros que los métodos anteriores para uniformar la clase:
    •  tcText: Texto para codificar
    •  tcFile: Nombre del archivo de imagen que desea generar. Si no se especifica ninguno, se genera un nombre de archivo aleatorio en la carpeta de archivos temporales de Windows.
    •  tnSize: El ancho y alto en pixeles de la imagen generada
    • tnType: Tipo de la imagen generada:  [png, gif, jpeg, jpg, svg, eps]

Todos estos métodos retornan la ruta y el nombre del archivo de la imagen generada con el código QR.

Ejemplos

En el siguiente ejemplo, se crean dos imágenes de Código QR, la primera con el método QRBarcodeImage() y la segunda con el método FullQRCodeImage():


SET PROCEDURE TO LOCFILE("FoxBarcodeQR.prg") ADITIVE
*--- Crear un objeto FoxBarcodeQR
LOCAL loFbc, lcQRImage
loFbc = CREATEOBJECT("FoxBarcodeQR")

*-- Utilizando la librería BarCodeLibrary.dll
lcQRImage1 = loFbc.QRBarcodeImage("http://vfpx.codeplex.com/wikipage?title=FoxBarcode",,6,0)

*-- Utilizando la librería QRCodeLib.dll (www.validacfd.com)
loFbc.nBackColor = RGB(0,255,255) && Yelow
loFbc.nBarColor = RGB(0,0,128) && Blue
loFbc.nCorrectionLevel = 2 && Q 25%
lcQRImage2 = loFbc.FullQRCodeImage("http://vfpx.codeplex.com/wikipage?title=FoxBarcode",,200,0)


Con BarCodeLibrary.dll

 


Con QRCodeLib.dll con mas opciones para configurar


A partir de ésta nueva versión 2.0 de FoxBarcodeQR se pueden codificar cadenas de caracteres mayores a 255 caracteres con la librería QRCodeLib.dll, y a partir de la versión 2.10 con la API de Google también. Ejemplo:

SET PROCEDURE TO LOCFILE("FoxBarcodeQR.prg") ADITIVE
*--- Create a FoxBarcodeQR object
LOCAL loFbc, lcQRImage
loFbc = CREATEOBJECT("FoxBarcodeQR")


m.lcString = ""
m.lnI = 0
DO WHILE LEN(m.lcString) < 512
  m.lnI = m.lnI + 1
  m.lcString = m.lcString + TRANSFORM(m.lnI) + ". - FoxbarcodeQR - "
ENDDO


*-- Using the QRCodeLib.dll library)
lcQRImage = loFbc.FullQRCodeImage(lcString,,330)

*-- Using the QR Server API
lcQRImage = loFbc.SvrQRCodeImage(lcString,,330))



Con QRCodeLib.dll

Con la API de QR Server


Para incluir un código de barras QR en un informe, se debe insertar un objeto Image y establecer la propiedad "ControlSource" con una llamada al método QRBarcodeImage(), FullQRCodeImage() o GooQRCodeImage(). Se recomienda ajustar "Escala de contenidos, mantener la forma" si el tamaño de la imagen difiere de la estructura.


Código QR en informes

Importante: Antes de ejecutar el informe y crear el objeto FoxBarcodeQR, se debe declarar la variable como PRIVATE de forma que ésta tenga alcance en el informe:

*--- Crear un objeto FoxBarcodeQR privado
PRIVATE poFbc
m.poFbc = CREATEOBJECT("FoxBarcodeQR")
... 
REPORT FORM FoxBarcodeQR PREVIEW


Distribución

Los únicos archivos necesarios para ser distribuidos para que FoxBarcodeQR funcione correctamente son:

Notas sobre la distribución e instalación del archivo BarCodeLibrary.dll y QRCodeLib.dll:

  • No se registran los archivos BarCodeLibrary.dll y QRCodeLib.dll. Debe estar ambos en la misma carpeta de la aplicación o en la carpeta del sistema de Windows.
  • BarCodeLibrary.dll y QRCodeLib.dll fueron probados y funcionan en Windows XP, 7, 8 y 10 (32 y 64 bits)

19 de febrero de 2016

Gauge, un nuevo proyecto en VFPx

El nuevo proyecto Gauge, disponible gratuitamente en VFPx, permite dibujar de forma rápida y fácil indicadores y medidores atractivos, o paneles de control en sus aplicaciones Visual FoxPro.

Se utiliza un componente de código abierto .NET para hacer el gráfico, junto con una pequeña clase contenedora en VFP. Un par de formularios de ejemplo muestran cómo utilizar el control Gauge.

Puede descargar la clase y los ejemplos libremente desde la página del proyecto en VFPx:

Gauge
Draws gauges in VFP applications
http://vfpx.codeplex.com/wikipage?title=Gauge

12 de junio de 2014

Nueva Actualización del archivo de Ayuda para VFP 9 SP2 en VFPX

Se ha actualizado el proyecto oficial "VFP 9 SP2 Help File" (Archivo de ayuda para VFP 9 SP2) en VFPX.

Este proyecto se creó cuando el Equipo Visual FoxPro de Microsoft cedió los derechos del código fuente del Archivo de Ayuda para VFP 9 SP2 y permitió su modificación por parte de la Comunidad de Visual FoxPro.

La última actualización del Archivo de ayuda para VFP 9 SP2 está disponible en http://vfpx.codeplex.com/releases/view/23319

VFPX

¿Cuáles son los objetivos de este proyecto?
  1. Proporcionar a la comunidad VFP el Archivo de Ayuda para VFP 9 SP2 corregido. Las correcciones incluidas en el archivo son: el índice, los hipervínculos, y los estilos.
  2. Permitir a la Comunidad VFP mejorar aún más el Archivo de Ayuda, añadiendo el contenido faltante para VFP 9 SP2 y Sedna, y haciendo las correcciones necesarias a los ejemplos.
La página del proyecto es:

-- VFP9 SP2 Help File --
http://vfpx.codeplex.com/wikipage?title=VFP%209%20SP2%20Help%20File

8 de septiembre de 2013

Documentación de FoxBarcode

FoxBarcode es una clase 100% Visual FoxPro que ofrece una herramienta para la generación de imágenes con distintas simbologías de códigos de barras, para ser usadas en informes y formularios de VFP, o exportadas a otras aplicaciones. Su uso y distribución es libre para toda la Comunidad de Visual FoxPro.

Sitio oficial de FoxBarcode: https://github.com/VFPX/FoxBarCode

Nuevo -> Última versión: 1.19 lanzada el 21/05/2019

Sitio de Descarga: https://github.com/VFPX/FoxBarCode

Características

FoxBarcode soporta las siguientes 18 simbologías lineales de códigos de barras: Código 128, Código 39, Código 39 Extendido (Full ASCII), Código 93, Código 93 Extendido (Full ASCII), Standard 2 de 5, Interleaved 2 de 5, EAN-8, EAN-13, UPC-A, UPC-E (EAN y UPC con suplementos de 2 y 5 dígitos), ITF-14, GS1/EAN/UCC-128, Codabar, Código 11, MSI / Plessey, Telepen, PostNet, RM4SCC, KIX-Code, One Track Pharmacode y Two Track Pharmacode.

FoxBarcode soporta los siguientes tipos de imagenes: JPG, BMP, GIF, PNG y TIFF

FoxBarcode genera las imágenes con la clase gpImage2 (http://sites.google.com/site/gpimage2) de Alexander Golovlev (Rusia) y Cesar Ch. (Brasil), basada en GDI+ y requiere gdiplus.dll.

FoxBarcode permite un gran control en la generación de la imagen del código de barras al poder personalizar las siguientes propiedades:
  • nImageHeight: Altura en pixeles de la imagen.
  • nImageWidth: Ancho en pixeles de la imagen. Ahora se puede configurar el ancho
  • nAlignBarcode: Alineación del código de barra con respecto a la imagen. [0=Izquierda, 1=Centro y 2=Derecha]
  • nResolution: Resolución de la imagén en DPI.  
  • nRotation: Rotación de la imagen. [0=0°, 1=90°, 2=180°, 3=270°]
  • cImageType: Tipo de la imagen generada ["JPG", "GIF", "PNG", "BMP", "TIF"]
  • cImageFile: Nombre del archivo de imagen generado. Si no se especifica, se genera un nombre de archivo aleatorio en la carpeta de archivos temporales de Windows.
  • cText: Texto a codificar.
  • nAlignText: Alineación del texto de la lectura humana. [0=Izquierda, 1=Centro, 2=Derecha]
  • lShowHumanReadableText: .T. si se muestra la lectura humana.
  • lShowCheckDigit: .T. si se muestra el dígito de control en la lectura humana.
  • lShowStartStopChars: .T. si se muestra los caracteres de inicio y final en la lectura humana.
  • cFontName: Nombre de la fuente de la lectura humana.
  • lFontBold: .T. si la fuente de la lectura humana es Negrita.
  • lFontItalic: .T. si la fuente de la lectura humana es Cursiva.
  • nFontSize: Tamaño de la letra de la lectura humana. [Recomendado = 8 ó 9]
  • nFontColor: Color de la fuente de la lectura humana. [Recomendado = Negro = RGB(0,0,0)].
  • nBackColor: Color de fondo de la imagen [Recomendado = Blanco = RGB(255,255,255)].
  • nBarsColor: Color de las barras [Recomendado = Negro = RGB(0,0,0)].
  • nBarcodeType: Tipo de la simbología de código de barra. Vea la lista de codigos de barra soportados y su Id.
  • cSet128 Set: Juego del Código 128. ["A", "B", "C" y "*" (Auto)]
  • cSupplementalText: Texto suplementario en códigos EAN y UPC.
  • lAddCheckDigit: .T. si se calcula el dígito de control. En las simbologías en donde el dígito de control es obligatorio, no se tiene en cuenta esta propiedad.
  • nBearerBar: Tipo del marco portante, solo en la simbología ITF-14.  [0=Ninguno, 1=Rectángulo, 2=Superior e inferior]
  • lUseAppId:  .T. para que FoxBarcode interprete en el código GS1/EAN/UCC-128 a los Identificadores de Aplicación (encerrados entre paréntesis).
  • nFactor: Factor de magnificación del código de barras. [1..9]
  • nMargin: Margen alrededor del código de barras. 
  • nRatio: Relación entre las barras angostas y las barras anchas en las simbologías que lo permiten.
  • lDeleteTempFiles: Permite elegir si borra o no la carpeta temporal con las imágenes temporales.
Para la generación de la imagen, solo se debe llamar al método BarcodeImage() que genera la imagen del código de barras y retorna la ruta y nombre de archivo generado.

Ahora se puede validar previamente la cadena a codificar con el método BarcodeTest()

FoxBarcode es compatible con todas las versiones de Visual FoxPro a partir de la versión 6.0

Lenguajes

Gracias a la Comunidad Mundial de VFP, se tradujeron los mensajes de FoxBarcode a los siguientes lenguajes:
  • Inglés
  • Español por VFPEncoding
  • Checo por Martin Krivka
  • Holandés por Koen Piller
  • Alemán por Stefan Wuebbe
  • Indonesio por Samir H.
  • Portugués por Cesar Ch.
  • Turco por Ugur Yilmaz
  • Filipino por Glenn Gevero
  • Francés por Samir H.
  • Serbio por Michael Kopljan
  • Italiano por Roberto Saccomanno
Ejemplos

El siguiente es un ejemplo de código para generar una imagen tipo "PNG" del código de barras "Código 128 C" con una altura de "100" pixeles y un factor de magnificación de "2":
*-- Crear el objeto
loFbc = CREATEOBJECT("FoxBarcode")

*-- Configurar las propiedades
WITH loFBC
  .cImageType = "PNG"
  .nBarcodeType = 110 && Code 128
  .cSet128 = "C" && Set 128 C
  .nImageHeight = 100
  .nFactor = 2
ENDWITH

*-- Generar la imagen 
lcImagen = loFbc.BarcodeImage("123456789012")
Desde la versión 0.11 se agregó un 3er. parámetro al método BarcodeImage() que permite configurar varias propiedades, separadas por comas. El mismo ejemplo de arriba, con el uso del 3er. parámetro.
*-- Creo el objeto
loFbc = CREATEOBJECT("FoxBarcode")
*-- Genero la imagen con sus propiedades
lcImagen = loFbc.BarcodeImage("","",[cText="123456789012", cImageType="PNG", ;
           nBarcodeType=110, cSet128="C", nImageHeight=100, nFactor=2])

La imagen generada se muestra a continuación


Otras imágenes de ejemplo cambiando solo algunas propiedades de la clase FoxBarcode





Ahora FoxBarcode soporta el código EAN/UCC/GS1 128


Para incluir un código de barras en un formulario, se debe insertar un objeto Image. Como la imagen del código de barras no existe en tiempo de diseño, la propiedad Picture tomará el nombre de la imagen cuando se llame al método BarcodeImage(), por ejemplo desde el método Refresh de Formulario, como se muestra en la siguiente figura:



Para incluir un código de barras en un Informe, se debe insertar un objeto Image y configurar la propiedad ControlSource con un llamado al método BarcodeImage() y se recomienda configurar "Scale contents, retain shape" si la imagen difiere de tamaño con el cuadro.



NOTA: Antes de ejecutar el informe y crear el objeto FoxBarcode, se debe declarar la variable como PRIVATE para que ésta tenga alcance en el informe, como se muestra a continuación:
PRIVATE poFbc
poFbc = CREATEOBJECT("FoxBarcode")
...
REPORT FORM MyReport
Distribución

Los únicos archivos necesarios que se deben distribuir para que FoxBarcode funcione correctamente son:
  • FoxBarcode.prg
  • gpImage2.prg
Estos archivos se encuentran en la carpeta \Source incluída en el archivo de la descarga.

Antes de instanciar la clase FoxBarcode, se deben ejecutar las siguientes sentencias:
SET PROCEDURE TO LOCFILE("FoxBarcode.prg"), LOCFILE("gpImage2.prg") ADDITIVE

Demo

En los archivos de la descarga, está incluido un proyecto completo de una aplicación Demo que utiliza FoxBarcode. La siguiente es una captura de pantalla de la aplicación.



La aplicación permite:
  • Configurar todas las propiedades de la clase FoxBarcode y muestrar la imagen generada automáticamente.
  • Copiar al portapapeles la imagen generada.
  • Guardar en un archivo la imagen.
  • Imprimir el código de barras.
  • Ejecutar diversos informes y formularios de ejemplo.
  • Construir un Script con el código en Visual FoxPro.
En la aplicación también se muestra una breve descripción de cada simbología de códigos de barras, según se seleccione en la lista desplegable de las simbologías.

Puede leer mas sobre este demo en: Generando códigos de barras con FoxBarcode



¿Quiénes somos?

VFPEncoding es un grupo de desarrolladores pertenecientes a la Comunidad Hispana de Visual FoxPro que creo FoxBarcode. Los miembros de VFPEncoding son:
  • Guillermo Carrero [QEPD] (Barcelona, España)
  • Luis María Guayán (Tucumán, Argentina)
Agradecimientos
  • A nuestras familias.
  • A Cesar Ch. por sus continuas ideas y colaboraciones con sus clases gpImage2 y FoxyPreviewer.

17 de febrero de 2013

Ahora FoxBarcode soporta Codigo QR

Se lanzó un complemento de FoxBarcode llamado FoxBarcodeQR para generar códigos de barra QR desde Visual FoxPro.

FoxBarcodeQR v.1.00 es un complemento de la clase FoxBarcode para generar solamente códigos de barra QR a través de la librería BarCodeLibrary.DLL de Darío Álvarez Aranda (México).

FoxBarcodeQR encapsula las funciones de la librería BarCodeLibrary y brinda una solución alternativa para todos los desarrolladores que solicitaron el soporte de FoxBarcode para el Código QR​.

Mas información sobre FoxBarcodeQR y enlaces para su descarga en los sitios oficiales de la clase en:

-- FoxBarcodeQR en Español --
https://sites.google.com/site/foxbarcode/foxbarcodeqr

-- FoxBarcodeQR en Inglés --
https://github.com/VFPX/FoxBarcodeQR

2 de abril de 2011

Documentación en Español de FoxyPreviewer

Artículo original: FoxyPreviewer Documentation
http://foxypreviewer.codeplex.com/documentation
Autor: VFPIMAGING
Traducido por: Luis Maria Guayán

Requisitos previos:

Visual FoxPro 9 SP2

Si utiliza formularios de nivel superior, se requiere la instalación de la última revisión acumulativa para VFP9 SP2 KB968409, para corregir un error del SP2 que hace que la barra de herramientas en un formulario de nivel superior se muestre deshabilitada. La forma más fácil de actualizar su VFP9SP2 con las revisiones más recientes es instalar el "Woody's Runtime Installer", que se puede encontrar aquí: Woody VFP9 SP2 Runtime Installer con todas las revisiones (Rev 7423)

Uso:

Para usarlo con sus propios informes se hizo aún más simple de lo que era originalmente. Ahora puede utilizar FoxyPreviewer de dos maneras:

1 - Sin cambiar nada de código en su aplicación (Modo Simplificado)

Vea lo fácil es cambiar completamente el aspecto y darle algunos super poderes a sus informes:
DO FOXYPREVIEWER.APP 
REPORT FORM YourReport PREVIEW 
Eso es todo!

Esto significa que todo lo que necesita hacer es "DO FoxyPreviewer.App" al inicio de su ejecutable, y todos los informes que utilizan la cláusula "PREVIEW" se visualizaran mediante la interfaz simplificada y súper poderosa de FoxyPreviewer.

Tenga en cuenta que algunas funciones no están disponibles con esta opción, pero siguen siendo más vistosos, como se puede ver en la tabla al final de este artículo.

2 - El modo original y mas poderoso (Modo Mejorado)

Con sólo cuatro líneas de código podrá incluir más funcionalidades:
LOCAL loReport AS "PreviewHelper" OF "FoxyPreviewer.App" 
loReport = CREATEOBJECT("PreviewHelper") 
loReport.AddReport(_Samples + "\Solution\Reports\colors.frx", "FOR Client = 'VFPx' ") && FRX File, Clauses 
loReport.RunReport() 

El archivo principal es FOXYPREVIEWER.APP que contiene la clase PreviewHelper que es la clase que se necesita para crear una instancia para que las nuevas opciones de barra de herramientas. Ésta usa la clase ExtensionHandler de ReportListener para realizar todos los cambios en la barra de herramientas original.


Comparación entre los dos modos:


FunciónVista previa predeterminada de VFP 9FoxyPreviewer simplificadoFoxyPreviewer mejorado
Búsqueda en vista previaNoSiSi
Botón del cuadro de diálogo de impresoraNoSiSi
Miniaturas de vista previa de páginasNoSiSi
Guardar como archivo de imagenNoSiSi
Guardar como PDFNoSiSi
Guardar como RTFNoSiSi
Guardar como XLS / XMLNoSiSi
Guardar como HTMLNoNoSi
Guardar como TXTNoNoSi
Número de copiasNoNoSi
Lista desplegable de impresorasNoNoSi
Textos justificadosNoSiSi
Botones grandesNoSiSi
Enviar correo electrónicoNoSiSi
Cambiar la configuración interactivamenteNoSiSi
Traducido a otros idiomasNoSiSi
Barra de progreso mejoradaNoSiSi
Líneas de código necesario para ejecutar un informe114

Personalización en Modo Mejorado

Toda la información siguiente se aplica solamente al Modo Mejorado !!!
Obviamente que puede elegir qué funciones estarán disponibles en la barra de herramientas de la vista previa del informe. Hay algunas propiedades evidentes que puede establecerse para configurar sus necesidades. A continuación se muestran los métodos y propiedades disponibles:

6 de diciembre de 2010

Liberada la versión Beta de FoxBarcode

Se liberó la versión 0.10 de FoxBarcode, una clase 100% Visual FoxPro que ofrece una herramienta para la generación de imágenes con distintas simbologías de códigos de barras, para ser usadas en informes y formularios de VFP, o exportadas a otras aplicaciones.

Sitio oficial de FoxBarcode: https://github.com/VFPX/FoxBarCode

Nuevo -> Última versión: 1.19 lanzada el 21/05/2019

Sitio de Descarga: https://github.com/VFPX/FoxBarCode

Características

FoxBarcode soporta las siguientes 18 simbologías lineales de códigos de barras: Código 128, Código 39, Código 39 Extendido (Full ASCII), Código 93, Código 93 Extendido (Full ASCII), Standard 2 de 5, Interleaved 2 de 5, EAN-8, EAN-13, UPC-A, UPC-E (EAN y UPC con suplementos de 2 y 5 dígitos), ITF-14, GS1/EAN/UCC-128, Codabar, Código 11, MSI / Plessey, Telepen, PostNet, RM4SCC, KIX-Code, One Track Pharmacode y Two Track Pharmacode.

FoxBarcode soporta los siguientes tipos de imagenes: JPG, BMP, GIF, PNG y TIFF

FoxBarcode genera las imágenes con la clase gpImage2 (http://sites.google.com/site/gpimage2) de Alexander Golovlev (Rusia) y Cesar Ch. (Brasil), basada en GDI+ y requiere gdiplus.dll.

FoxBarcode permite un gran control en la generación de la imagen del código de barras al poder personalizar las siguientes propiedades:
  • nImageHeight: Altura en pixeles de la imagen.
  • nImageWidth: Ancho en pixeles de la imagen. Ahora se puede configurar el ancho
  • nAlignBarcode: Alineación del código de barra con respecto a la imagen. [0=Izquierda, 1=Centro y 2=Derecha]
  • nResolution: Resolución de la imagén en DPI.  
  • nRotation: Rotación de la imagen. [0=0°, 1=90°, 2=180°, 3=270°]
  • cImageType: Tipo de la imagen generada ["JPG", "GIF", "PNG", "BMP", "TIF"]
  • cImageFile: Nombre del archivo de imagen generado. Si no se especifica, se genera un nombre de archivo aleatorio en la carpeta de archivos temporales de Windows.
  • cText: Texto a codificar.
  • nAlignText: Alineación del texto de la lectura humana. [0=Izquierda, 1=Centro, 2=Derecha]
  • lShowHumanReadableText: .T. si se muestra la lectura humana.
  • lShowCheckDigit: .T. si se muestra el dígito de control en la lectura humana.
  • lShowStartStopChars: .T. si se muestra los caracteres de inicio y final en la lectura humana.
  • cFontName: Nombre de la fuente de la lectura humana.
  • lFontBold: .T. si la fuente de la lectura humana es Negrita.
  • lFontItalic: .T. si la fuente de la lectura humana es Cursiva.
  • nFontSize: Tamaño de la letra de la lectura humana. [Recomendado = 8 ó 9]
  • nFontColor: Color de la fuente de la lectura humana. [Recomendado = Negro = RGB(0,0,0)].
  • nBackColor: Color de fondo de la imagen [Recomendado = Blanco = RGB(255,255,255)].
  • nBarsColor: Color de las barras [Recomendado = Negro = RGB(0,0,0)].
  • nBarcodeType: Tipo de la simbología de código de barra. Vea la lista de codigos de barra soportados y su Id.
  • cSet128 Set: Juego del Código 128. ["A", "B", "C" y "*" (Auto)]
  • cSupplementalText: Texto suplementario en códigos EAN y UPC.
  • lAddCheckDigit: .T. si se calcula el dígito de control. En las simbologías en donde el dígito de control es obligatorio, no se tiene en cuenta esta propiedad.
  • nBearerBar: Tipo del marco portante, solo en la simbología ITF-14.  [0=Ninguno, 1=Rectángulo, 2=Superior e inferior]
  • lUseAppId:  .T. para que FoxBarcode interprete en el código GS1/EAN/UCC-128 a los Identificadores de Aplicación (encerrados entre paréntesis).
  • nFactor: Factor de magnificación del código de barras. [1..9]
  • nMargin: Margen alrededor del código de barras. 
  • nRatio: Relación entre las barras angostas y las barras anchas en las simbologías que lo permiten.
  • lDeleteTempFiles: Permite elegir si borra o no la carpeta temporal con las imágenes temporales.
Para la generación de la imagen, solo se debe llamar al método BarcodeImage() que genera la imagen del código de barras y retorna la ruta y nombre de archivo generado.

Ahora se puede validar previamente la cadena a codificar con el método BarcodeTest()

FoxBarcode es compatible con todas las versiones de Visual FoxPro a partir de la versión 6.0

Lenguajes

Gracias a la Comunidad Mundial de VFP, se tradujeron los mensajes de FoxBarcode a los siguientes lenguajes:
  • Inglés
  • Español por VFPEncoding
  • Checo por Martin Krivka
  • Holandés por Koen Piller
  • Alemán por Stefan Wuebbe
  • Indonesio por Samir H.
  • Portugués por Cesar Ch.
  • Turco por Ugur Yilmaz
  • Filipino por Glenn Gevero
  • Francés por Samir H.
  • Serbio por Michael Kopljan
  • Italiano por Roberto Saccomanno
Ejemplos

El siguiente es un ejemplo de código para generar una imagen tipo "PNG" del código de barras "Código 128 C" con una altura de "100" pixeles y un factor de magnificación de "2":
*-- Crear el objeto
loFbc = CREATEOBJECT("FoxBarcode")

*-- Configurar las propiedades
WITH loFBC
  .cImageType = "PNG"
  .nBarcodeType = 110 && Code 128
  .cSet128 = "C" && Set 128 C
  .nImageHeight = 100
  .nFactor = 2
ENDWITH

*-- Generar la imagen 
lcImagen = loFbc.BarcodeImage("123456789012")
Desde la versión 0.11 se agregó un 3er. parámetro al método BarcodeImage() que permite configurar varias propiedades, separadas por comas. El mismo ejemplo de arriba, con el uso del 3er. parámetro.
*-- Creo el objeto
loFbc = CREATEOBJECT("FoxBarcode")
*-- Genero la imagen con sus propiedades
lcImagen = loFbc.BarcodeImage("","",[cText="123456789012", cImageType="PNG", ;
           nBarcodeType=110, cSet128="C", nImageHeight=100, nFactor=2])

La imagen generada se muestra a continuación


Otras imágenes de ejemplo cambiando solo algunas propiedades de la clase FoxBarcode





Ahora FoxBarcode soporta el código EAN/UCC/GS1 128


Para incluir un código de barras en un formulario, se debe insertar un objeto Image. Como la imagen del código de barras no existe en tiempo de diseño, la propiedad Picture tomará el nombre de la imagen cuando se llame al método BarcodeImage(), por ejemplo desde el método Refresh de Formulario, como se muestra en la siguiente figura:



Para incluir un código de barras en un Informe, se debe insertar un objeto Image y configurar la propiedad ControlSource con un llamado al método BarcodeImage() y se recomienda configurar "Scale contents, retain shape" si la imagen difiere de tamaño con el cuadro.



NOTA: Antes de ejecutar el informe y crear el objeto FoxBarcode, se debe declarar la variable como PRIVATE para que ésta tenga alcance en el informe, como se muestra a continuación:
PRIVATE poFbc
poFbc = CREATEOBJECT("FoxBarcode")
...
REPORT FORM MyReport
Distribución

Los únicos archivos necesarios que se deben distribuir para que FoxBarcode funcione correctamente son:
  • FoxBarcode.prg
  • gpImage2.prg
Estos archivos se encuentran en la carpeta \Source incluída en el archivo de la descarga.

Antes de instanciar la clase FoxBarcode, se deben ejecutar las siguientes sentencias:
SET PROCEDURE TO LOCFILE("FoxBarcode.prg"), LOCFILE("gpImage2.prg") ADDITIVE

Demo

En los archivos de la descarga, está incluido un proyecto completo de una aplicación Demo que utiliza FoxBarcode. La siguiente es una captura de pantalla de la aplicación.



La aplicación permite:
  • Configurar todas las propiedades de la clase FoxBarcode y muestrar la imagen generada automáticamente.
  • Copiar al portapapeles la imagen generada.
  • Guardar en un archivo la imagen.
  • Imprimir el código de barras.
  • Ejecutar diversos informes y formularios de ejemplo.
  • Construir un Script con el código en Visual FoxPro.
En la aplicación también se muestra una breve descripción de cada simbología de códigos de barras, según se seleccione en la lista desplegable de las simbologías.

Descargas

Para descargar la última versión de FoxBarcode, visite la página de Descargas de FoxBarcode haciendo clic aquí.

Feedback

FoxBarcode se encuentra en fase Beta, por lo que cualquier comentario será bienvenido. Los comentarios, como así también los reportes de incidencias usando la clase FoxBarcode se deben enviar por correo electrónico a vfpencoding@gmail.com

¿Quiénes somos?

VFPEncoding es un grupo de desarrolladores pertenecientes a la Comunidad Hispana de Visual FoxPro que creo FoxBarcode. Los miembros de VFPEncoding son:
  • Guillermo Carrero (Barcelona, España) (Q.E.P.D)
  • Luis María Guayán (Tucumán, Argentina)
Agradecimientos
  • A nuestras familias.
  • Cesar Ch. por sus continuas ideas y colaboraciones con sus clases gpImage2 y FoxyPreviewer.

20 de octubre de 2008

Liberado FoxCharts 1.0 Release Candidate

Ya esta disponible para descarga libre y gratuita la versión 1.0 Release Candidate de esta excelente clase de código abierto.

Gracias Cesar por todo tu esfuerzo para liberar esta versión de esta excelente clase para toda la comunidad mundial de Visual FoxPro.

Pueden descargar FoxCharts 1.0 Release Candidate libremente de:

http://vfpx.codeplex.com/releases/view/18515

Los requisitos para utilizar FoxCharts son:

. Visual FoxPro 9.0
. Librería GdiPlusX de VFPX

Algunos ejemplos de la clase FoxCharts (http://vfpx.codeplex.com/wikipage?title=FoxCharts)







25 de abril de 2008

FoxCharts (Traducción)

Artículo original: FoxCharts
http://weblogs.foxite.com/vfpimaging/archive/2008/04/04/5919.aspx
Autor: VFPIMAGING
Traducido por: Ana María Bisbé York


¿Desea crear algunos gráficos geniales en VFP?

¿Sin controles ActiveX, dlls o productos de terceros? ¿Qué piensa de estos gráficos?









Recientemente, tuve muchas discusiones con gente que pedía componentes para gráficos. Una vez que GdiPlusX nos brinda todas esas posibilidades, pensé que valdría la pena comenzar un proyecto sobre esto.

FoxCharts será una subclase de la clase ImageCanvas de GdiPlusX, que nos permite dibujar directamente sobre un objeto imagen, entre muchos otras características útiles y estupendas, que están fuera del alcance de este escrito.

Objetivos de FoxCharts:
  • Crear gráficos bonitos y modernos en puro VFP
  • No hay componentes ActiveX
  • Fácil de configurar
  • Fácil de personalizar.
  • Fácil de guardar en disco o imprimir
  • Código abierto (open source)
  • Aprovechar las capacidades de dibujos de GdiPlusX, que permiten a los usuarios modificar los gráficos de la forma que quieran.
  • Guardar como EMF, resultando gráficos perfectos al imprimir en informes VFP.

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

3 de marzo de 2008

Nuevas liberaciones de código en VFPx

En estos últimos días se liberaron y publicaron nuevas actualizaciones de código en el sitio de VFPx: Foxpro Foundation Classes (FFC) y Visual FoxPro XSource.


Aquí están dos nuevos proyectos lanzados en VFPx con código actualizado

Foxpro Foundation Classes (FFC)

Estas librerias de clases visuales de Visual FoxPro se encuentran en la carpeta \FFC del directorio de instalación de Visial FoxPro 9.0. Estas librerias contienen una gran variedad de clases que se pueden utilizar para realzar nuestras aplicaciones. Tenga en cuenta la información del acuerdo de licencia de usuario final (EULA) contenida en la descarga.

Para descargar la última liberación de Foxpro Foundation Classes (FFC) haga clic aquí.

Visual FoxPro XSource

Este proyecto contiene el archivo XSource.zip que se encuentra en la carpeta \Tools\XSource del directorio de instalación de Visial FoxPro 9.0. XSource contiene el código fuente de varios componentes de Visual FoxPro. Tenga en cuenta la información del acuerdo de licencia de usuario final (EULA) que se encuentra en el archivo XSource_EULA.txt contenido en la descarga.

Puede descargar todos los proyectos XSource de:
O cada componente individualmente:

7 de febrero de 2008

El namespace My en Sedna

Introducción

El namespace My, igual al introducido en Visual Studio 2005, está ahora disponible en Sedna. Las clases My crean un envoltorio a algunas funciones SYS(), funciones de la API de Windows, y métodos y propiedades de Windows Script Host, haciendo que sean mas fáciles de entender y poder escribir menos líneas de código. Todo esto ayudado por IntelliSense incluido en el namespace My.

Un buen ejemplo de esto, es el método Play que ejecuta un archivo de audio, que de la forma tradicional, con la API de Windows debíamos declarar la función y luego ejecutarla:

declare integer sndPlaySound in WinMM.dll ;
  string lpszSoundName, integer uFlags

sndPlaySound('Ding.wav', 0)

Ahora con Sedna podemos escribir solamente:

My.Computer.Audio.Play('Ding.wav')

Esta nueva clase está muy bien documentada en el archivo de ayuda My.chm incluido en la descarga de Sedna. Obviamente esta ayuda está en inglés, por lo que este artículo intentará ser una breve ayuda para la comunidad de habla hispana.

¿Cómo empezar?

Una vez descargado e instalado el complemento Sedna (ver los artículos anteriores "Sedna disponible para descarga" y "Sedna ya esta oficialmente en VFPx"), se debe registrar My con IntelliSense ejecutando la aplicación My.app, que se encuentra en la carpeta Sedna\My en el directorio de instalación de Visual FoxPro 9.0.

En el editor de código escribimos LOCAL My AS y seleccionamos el tipo My de la lista de tipos como se muestra a continuación:



Automáticamente se completará con el siguiente código:



Ahora escribiendo My. aparecerá la lista de los cinco namespaces disponibles en My:



My.App

Este namespace proporciona métodos y propiedades de la aplicación.

Por ejemplo para ejecutar un archivo específico con la aplicación asociada, utilizamos el método Execute:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
lcArchivo = GETFILE('HTM')
My.App.Execute(lcArchivo)

My.App.Info contiene métodos y propiedades de una aplicación específica o de la aplicación actual.

El siguiente ejemplo muestra información de la aplicación VFP9.EXE utilizando el método GetApplicationInformation:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
lcArchivo = HOME() + 'vfp9.exe'
My.App.Info.GetApplicationInformation(lcArchivo)
MESSAGEBOX( ;
  My.App.Info.ProductName + CHR(13) + ;
  My.App.Info.Version + CHR(13) + ;
  My.App.Info.Copyright, ;
  64, My.App.Info.CompanyName )

My.Computer

Proporciona acceso a varios componentes de la computadora.

La propiedad ComputerName nos muestra el nombre de la computadora
? My.Computer.ComputerName

Con My.Computer.Audio podemos ejecutar los sonidos del sistema con el método PlaySystemSound, o ejecutar un archivo de sonido específico con el método Play:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
My.Computer.Audio.PlaySystemSound('Stop')
My.Computer.Audio.Play('C:\Windows\Media\Ringout.wav')

Con My.Computer.Time podemos tomar la fecha y hora local, su descripción, la fecha y hora GMT (Greenwich Mean Time), o convertir de Local a GMT y viceversa:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
? My.Computer.Clock.LocalTime
? My.Computer.Clock.TimeZoneDescription
? My.Computer.Clock.GMTTime
? My.Computer.Cloc? My.Computer.Clock.ConvertLocalToGMT(DATETIME())

Con MyComputer.FileSystem podemos tener acceso a los atributos y métodos del sistema de archivos:

Con My.Computer.FileSystem.SpecialDirectories obtenemos las rutas de las carpetas especiales del usuario actual:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
lcArchivo = HOME() + 'vfp9.exe'
WITH My.Computer.FileSystem.SpecialDirectories
  ? .Desktop      && Escritorio
  ? .Favorites    && Favoritos
  ? .MyDocuments  && Mis Documentos
  ? .NetHood      && Entorno de red
  ? .PrintHood    && Impresoras
  ? .Programs     && Programas
  ? .StartMenu    && Menú inicio
  ? .Temp         && Carpeta temporal
ENDWITH
Podemos copiar un archivo con el método CopyFile:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
lcFile = GETFILE()
lcCopy = ADDBS(JUSTPATH(lcFile)) + 'Copia de ' + JUSTFNAME(lcFile)
My.Computer.FileSystem.CopyFile(lcFile, lcCopy)
Podemos mover un archivo con el método MoveFile:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
lcFile = GETFILE()
lcCopy = ADDBS(JUSTPATH(lcFile)) + 'Copia de ' + JUSTFNAME(lcFile)
My.Computer.FileSystem.MoveFile(lcFile, lcCopy)
Podemos copiar una carpeta completa con el método CopyDirectory:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
lcDir = GETDIR()
lcDir = LEFT(lcDir, LEN(lcDir)-1)
lcCopy = 'C:\Copia de ejemplo'
My.Computer.FileSystem.CopyDirectory(lcDir, lcCopy)
Podemos mover una carpeta completa con el método MoveDirectory:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
lcDir = GETDIR()
lcDir = LEFT(lcDir, LEN(lcDir)-1)
lcCopy = 'C:\Copia de ejemplo'
My.Computer.FileSystem.MoveDirectory(lcDir, lcCopy)
Con el método GetFileInfo podemos acceder a distintas propiedades de un archivo especificado:
LOCAL My AS My
My = NEWOBJECT('My', 'My.vcx')
lcFile = GETFILE()
WITH My.Computer.FileSystem.GetFileInfo(lcFile)
  ? 'Nombre: ' + .NAME
  ? 'Carpeta: ' + .PATH
  ? 'Tipo: ' + .TYPE
  ? 'Tamaño: ' + TRANSFORM(.SIZE)
  ? 'Creado: ' + TRANSFORM(.DateCreated)
  ? 'Accedido: ' + TRANSFORM(.DateLastAccessed)
  ? 'Modificado: ' + TRANSFORM(.DateLastModified)
ENDWITH
Con el método GetDirectoryInfo podemos acceder a distintas propiedades de una carpeta especificada:
LOCAL My AS My
My = NEWOBJECT('My', 'My.vcx')
lcDir = GETDIR()
WITH My.Computer.FileSystem.GetDirectoryInfo(lcDir)
  ? 'Nombre: ' + .NAME
  ? 'Carpeta: ' + .PATH
  ? 'Archivos: ' + TRANSFORM(.Files.Count)
  ? 'Creado: ' + TRANSFORM(.DateCreated)
  ? 'Accedido: ' + TRANSFORM(.DateLastAccessed)
  ? 'Modificado: ' + TRANSFORM(.DateLastModified)
ENDWITH
Con el método GetDriveInfo podemos acceder a distintas propiedades de la unidad de disco especificada:
LOCAL My AS My
My = NEWOBJECT('My', 'My.vcx')
WITH My.Computer.FileSystem.GetDriveInfo("C")
? 'Unidad: ' + .DriveLetter
? 'Volumen: ' + .VolumeName
? 'Sistema: ' + .FileSystem
? 'Tamaño: ' + TRANSFORM(.TotalSize / 1024) + ' KB'
? 'Libre: ' + TRANSFORM(.FreeSpace / 1024) + ' KB'
? 'Nro.Serie: ' + RIGHT(TRANSFORM(.SerialNumber, '@0'),8)
ENDWITH
Con los métodos GetShortFileName y GetLongFileName podemos obtener el nombre corto de archivo (8.3), desde un nombre largo y viceversa respectivamente:
LOCAL My AS My
My = NEWOBJECT('My', 'My.vcx')
lcFile = GETFILE()
lcCorto = My.Computer.FileSystem.GetShortFileName(lcFile)
lcLargo = My.Computer.FileSystem.GetLongFileName(lcCorto)
? lcCorto
? lcLargo

My.Computer.Network nos proporciona las propiedades y métodos para tratar con redes:

Podemos descargar una página web con el método DownloadFile:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
IF 0 = My.Computer.Network.DownloadFile('http://www.portalfox.com/backend.php','My.xml')
  My.App.Execute('My.xml')
ELSE
  MESSAGEBOX('Error al descargar archivo,16,'Error'))
ENDIF
Podemos conectarnos a un recurso compartido con el método MapNetworkDrive:
LOCAL My AS My
My = NEWOBJECT('My', 'My.vcx')
My.Computer.Network.MapNetworkDrive('Z:','\\MiServidor\MiRecursoCompartido')
Y desconectarnos con el método RemoveNetworkDrive:
LOCAL My AS My
My = NEWOBJECT('My', 'My.vcx')
My.Computer.Network.RemoveNetworkDrive('Z:')

My.Computer.Printer nos proporciona información de las impresoras:

El método AvailablePrinters nos retorna una colección de objetos con todas las impresoras disponibles:
LOCAL My AS My
My = NEWOBJECT('My', 'My.vcx')
FOR EACH lo IN My.Computer.Printer.AvailablePrinters
  ? lo.PrinterName
ENDFOR
Las propiedades DefaultVFPPrinter y DefaultWindowsPrinter nos muestran las impresoras por omisión de Visual FoxPro y de Windows respectivamente:
LOCAL My AS My
My = NEWOBJECT('My', 'My.vcx')
? My.Computer.Printer.DefaultVFPPrinter
? My.Computer.Printer.DefaultWindowsPrinter
EL método PageSetup nos muestra el cuadro de diálogo de configuración de página:
My = NEWOBJECT('My', 'My.vcx')
IF My.Computer.Printer.PageSetup()
  REPORT FORM MiInforme TO PRINTER
ENDIF

My.Computer.Registry proporciona acceso al registro de Windows:

Podemos crear y leer un valor del registro de Windows con los métodos SetValue y GetValue:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
IF My.Computer.Registry.SetValue('HKEY_LOCAL_MACHINE\Software\PortalFox\Ejemplo', 'Version', '1.0.0')
  MESSAGEBOX(My.Computer.Registry.GetValue('HKEY_LOCAL_MACHINE\Software\PortalFox\Ejemplo','Version'),64,'Version')
ENDIF
Podemos borrar un valor o una clave completa del registro de Windows con los métodos DeleteKeyValue y DeleteKey:
LOCAL My AS My
MMy = NEWOBJECT('My', 'my.vcx')
*-- Borrar un valor de la clave
My.Computer.Registry.DeleteKeyValue('HKEY_LOCAL_MACHINE\Software\PortalFox\Ejemplo', 'Version')
*-- Borrar la clave completa
My.Computer.Registry.DeleteKey('HKEY_LOCAL_MACHINE\Software\PortalFox\Ejemplo')
Podemos enumerar todas las claves bajo una clave específica con el método EnumetateKeys.
LOCAL My AS My
My = NEWOBJECT('My', 'My.vcx')
lo = My.Computer.Registry.EnumerateKeys('HKEY_LOCAL_MACHINE\Software\Microsoft\Windows')
FOR EACH lc IN lo
  ? lc
NEXT
Podemos enumerar todas los valores de una clave específica con el método EnumetateValueKeys.
LOCAL My AS My
My = NEWOBJECT('My', 'My.vcx')
lo = My.Computer.Registry.EnumerateKeyValues('HKEY_LOCAL_MACHINE\Software\Microsoft\VisualFoxPro\9.0\Registration')
FOR ln = 1 TO lo.Count
  ? lo.GetKey(ln) + ' = ' + lo.Item(ln)
NEXT

My.Data

Proporciona características para el manejo de datos.

El método CloseAllInstances cierra todas las copias abiertas de una tabla pasada como parámetro en todas las sesiones de datos. Esto es útil si se necesita acceso exclusivo a la tabla, como por ejemplo para modificar su estructura.
 LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
My.Data.CloseAllInstances('MiTabla')
USE MiTabla EXCLUSIVE
El método OpenCursorSnapshot toma una instantánea de todos los cursores abiertos, de manera que luego el método CloseOpenedCursors solo cierra los cursores abiertos entre la llamada de ambos métodos.
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
My.Data.OpenCursorSnapshot()
USE MiVista1 IN 0
USE MiVista2 IN 0
&& ...
My.Data.CloseOpenedCursors()
El método Goto realiza un GOTO seguro, que nos asegura que el puntero ira al registro especificado, y si el número de registro no es válido, el puntero de registro se posicionará al final del archivo EOF().
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
USE MiTabla
My.Data.GoTo(99)

My.Settings

Proporciona configuraciones específicas para nuestras aplicaciones. Estas configuraciones se guardan en un archivo .XML con un esquema igual que los archivos de configuraciones de .NET. Cuando una configuración se carga con el método Load, o se agrega con el método Add; se convierte en una propiedad dinámica del objeto My, y se puede hacer referencia a esta propiedad como es muestra a continuación:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
My.Settings.Add('DirApp',FULLPATH(''))
? My.Settings.DirApp
Advierta que IntelliSense no esta disponible para las propiedades dinámicas, ya que estas se crean en tiempo de ejecución.

El namespace My.Setting contiene cuatro métodos que nos permiten agregar configuraciones, grabar configuraciones en un archivo, comprobar su existencia y cargar las configuraciones desde un archivo.

En el siguiente ejemplo, vamos a grabar/cargar la última posición y tamaño de un formulario cuando éste fue cerrado. Ejecute el fragmento de código de abajo, cambie la posición y tamaño del formulario, ciérrelo, y vuelva a ejecutar el código.
PUBLIC goForm AS MiForm
goForm = NEWOBJECT('MiForm')
goForm.SHOW(1)
RETURN

DEFINE CLASS MiForm AS FORM
  CAPTION = 'Mueva y cambie el tamaño del formulario'
  My = NULL
  PROCEDURE Init
    THIS.My =  NEWOBJECT('My', 'my.vcx')
    WITH THIS.My
      IF FILE(FULLPATH('MiConfig.xml'))
        .Settings.Load(FULLPATH('MiConfig.xml'))
      ENDIF
      IF .Settings.EXISTS('FormTop')
        THIS.TOP    = .Settings.FormTop
        THIS.LEFT   = .Settings.FormLeft
        THIS.HEIGHT = .Settings.FormHeight
        THIS.WIDTH  = .Settings.FormWidth
      ENDIF
    ENDWITH
  ENDPROC
  PROCEDURE Destroy
    WITH THIS.My
      .Settings.Add('FormTop', THIS.TOP)
      .Settings.Add('FormLeft', THIS.LEFT)
      .Settings.Add('FormHeight', THIS.HEIGHT)
      .Settings.Add('FormWidth', THIS.WIDTH)
      .Settings.Save(FULLPATH('MiConfig.xml'))
    ENDWITH
  ENDPROC
ENDDEFINE

My.User

Proporciona información del usuario actual con las siguientes propiedades:
LOCAL My AS My
My = NEWOBJECT('My', 'my.vcx')
? My.User.DisplayName
? My.User.UserDomain
? My.User.UserName

Para tener en cuenta

Si usa My en una aplicación, asegúrese de incluir My.vcx y My.dbf en su proyecto. Se recomienda marcar como incluida a la tabla My.dbf para que también queden incluidos los archivos My.cdx y My.fpt. Si usa el namespace My.Settings asegúrese de distribuir el archivo de configuración .XML.

Ninguna de las clases My tienen código en su método Error, con lo cual si ocurre un error en un método de My, lo atrapará el controlador de error global de su aplicación, a menos que encierre las llamadas a los métodos de My entre una estructura TRY ... CATCH ... ENDTRY.

Mejorar My

El acuerdo de licencia incluido en la descarga de Sedna, nos permite la distribución y la modificación del código fuente incluido para todos los componentes de Sedna. Nosotros podemos añadir mas funcionalidad a My, como así también crear nuestros propios namespaces o subclasear la clase My.
El Equipo Visual FoxPro de Microsoft lanzó el complemento Sedna como un proyecto de código compartido en VFPx. Este se dividió en 6 proyectos distintos. Para el caso de la librería My, la podemos encontrar en "My for VFP". Allí todos podemos colaborar para mejorar Sedna, como así también todas las clases disponibles en VFPx o VFPy. Quedan todos invitados a participar.

Hasta la próxima.

Luis María Guayán

28 de enero de 2008

Sedna ya esta oficialmente en VFPx

Sedna, la colección de librerías, ejemplos y complementos para Visual FoxPro 9.0 SP2 ya está oficialmente como un proyecto de código abierto compartido en VFPx en CodePlex.

vfpxicon_64px.gif

Ya están disponibles los Componentes Sedna para mejorarlos y ampliarlos en VFPx.
Sedna esta compuesto de seis diferentes proyectos:
vfpxmember_large.gif

2 de julio de 2007

Convertir imágenes a color monocromático con GdiPlusX

Artículo original: Convert Images to Monochrome with GdiPlus X
http://weblogs.foxite.com/vfpimaging/archive/2007/05/26/3857.aspx
Autor: Cesar Ch.
Traducido por: Ana María Bisbé York


Cada cierto tiempo, alguien pregunta sobre la creación de imágenes monocromáticas, que en la mayoría de los casos se utilizarán para enviar por Fax.

Desafortunadamente, GDI+ no brinda soporte para imágenes indexadas a 1 bpp (bipmaps monocromos)

Pero con la ayuda de Anatoliy Mogylevets y Mike Gagnon pude encontrar que la buena y vieja GDI (no GdiPlus) ofrece algunas funciones (CopyImage y LoadImage) para hacerlo en un flash. Entonces, estuvimos de acuerdo en añadir esta importante funcionalidad a la biblioteca como un método nuevo agregado a las clases Image y Bitmap: GetMonochrome().

Pasos para obtener la versión 1bpp monocromática de cualquier imagen utilizando las clases GDI+X
  1. Cargar la imagen con GdiPlus
  2. Llamar a Image.GetMonochrome para obtener un objeto nuevo que contenga la imagen 1bpp.
  3. Guardar normalmente como Bmp.
IMPORTANTE:
Todos los ejemplos siguientes utilizan la nueva biblioteca GdiPlus-X, que está en versión ALPHA; pero que es muy estable y fiable para hacer la mayoría de las tareas GDI+. Descargue la versión más actualizada desde Codeplex:

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

Este es el código de ejemplo:
_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx","vcx")))
WITH _SCREEN.System.Drawing
  * Crear un objeto Bitmap basado en un archivo BMP.
  LOCAL loOriginalBmp AS xfcBitmap
  loOriginalBmp = .Bitmap.New(GETPICT())
  LOCAL loMonoChrBmp as xfcBitmap
  loMonoChrBmp = loOriginalBmp.GetMonochrome()
  * Guardar el Bmp monocromático que ha sido creado
  loMonoChrBmp.Save("c:\Monocromatico.bmp", .Imaging.ImageFormat.Bmp)
ENDWITH
RETURN
Y este es el resultado para dos imágenes:





La primera imagen tiene buen aspecto, a que si?

Pero el logo VFPX no aparece en color monocromático. Esto ocurre porque el fondo naranja del texto es oscuro y GDI lo convierte en negro.

Pero utilizando un truco podemos arreglarlo, al convertir la imagen en escala de grises antes de convertirlo en monocromático. No está dentro del alcance de este corto artículo explicar cómo hacer esto, porque ya me dediqué a esto profundamente en dos artículos publicados en UTMAG Special effects on images with new GDIPlus-X classes - Part 1 y Special effects on images with new GDIPlus-X classes - Part 2.

Para convertir a escala de grises, podemos utilizar una matriz de color que va a convertir cada píxel en un promedio entre sus componentes rojo, azul y verde. Para escala de grises normalmente multiplicamos cada componente de color con 0.33 (1/3). Para obtener una imagen más brillante tenemos que multiplicar cada componente por un factor más alto.

Por tanto, he aquí los pasos para convertir a color monocromático:
  1. Crear la imagen originar con GDI+
  2. Crear un Bitmap nuevo temporal del mismo tamaño que el original
  3. Crear un objeto ImageAttributes
  4. Aplicar una matriz de color con escala de grises a la imagen Attributes
  5. Dibujar la imagen original utilizando ImageAttributes
  6. Guardar la imagen
Para este ejemplo he creado un lazo utilizando un factor con rango .10 a 1, para obtener imágenes diferentes.
_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx","vcx")))
WITH _SCREEN.System.Drawing
  LOCAL lcImgFile
  lcImgFile = GETPICT()
  * Crea un objeto Bitmap basado en un archivo BMP.
  LOCAL loOriginalBmp AS xfcBitmap
  loOriginalBmp = .Bitmap.FromFile(lcImgFile)
  LOCAL loTempBmp as xfcBitmap
  loTempBmp = .Bitmap.New(loOriginalBmp.Width, loOriginalBmp.Height)
  LOCAL loGfx as xfcGraphics
  loGfx = .Graphics.FromImage(loTempBmp)
  LOCAL loAttr as xfcImageAttributes
  LOCAL loGreyScaleMatrix as xfcColorMatrix
  LOCAL loMonoChrBmp as xfcBitmap
  LOCAL loRectBounds as xfcRectangle
  loRectBounds = loOriginalBmp.GetBounds()
  FOR lnFactor = .10 TO 1 STEP .10
    loGreyScaleMatrix = _Screen.System.Drawing.Imaging.ColorMatrix.New( ;
      lnFactor, lnFactor, lnFactor, 0.0, 0.0, ;
      lnFactor, lnFactor, lnFactor, 0.0, 0.0, ;
      lnFactor, lnFactor, lnFactor, 0.0, 0.0, ;
      0.0 , 0.0 , 0.0 , 1.0, 0.0, ;
      0.0 , 0.0 , 0.0 , 0.0, 1.0)
    loAttr = NULL
    loAttr = .Imaging.ImageAttributes.New()
    loAttr.SetColorMatrix(loGreyScaleMatrix)
    * Dibujar una imagen con las transformaciones en la matriz de colores
    loGfx.DrawImage(loOriginalBmp, loRectBounds, loRectBounds, 2, loAttr)
    loMonoChrBmp = loTempBmp.GetMonochrome()
    * Guarda el Bmp monocromático que ha sido creado
    loMonoChrBmp.Save("c:\" + JUSTSTEM(lcImgFile) + ;
      TRANSFORM(lnFactor * 100) + ".bmp", .Imaging.ImageFormat.Bmp)
  ENDFOR
ENDWITH
RETURN
Y esta vez podemos obtener mejores resultados, acorde con el factor deseado.

Imagen Original
Factor = 10 Factor = 20 Factor = 30 Factor = 40 Factor = 50
Factor = 60 Factor = 70 Factor = 80 Factor = 90 Factor = 100


Imagen Original
Factor = 10 Factor = 20 Factor = 30 Factor = 40 Factor = 50
Factor = 60 Factor = 70 Factor = 80 Factor = 90 Factor = 100

Enlaces relacionados:

Artículos en UTMAG