Grupo, a mi este ejemplo me sirvio para almacenar las imagenes jpg de un
tamaƱo aceptable, ya que si bien le permitia al usuario elegir cualquier jpg
para poner luego en su reporte, algunos usuarios elegian imagenes muy
grandes y  a la hora de almacenarlas o cargarlas en la pantalla tardaban
demasiado y a veces no se cargaban.

Si bien esto no resuelve el problema de Carlos del dia 30, quizas ayude a
que nuestras aplicaciones consuman menos memoria.

Esta es la funcion resultante de ese dia,

LPARAMETERS lcImagenOri,lcImagenDes,lnAlto,lnAncho
#DEFINE GDIPLUS_PIXELFORMAT_1bppIndexed      0x00030101
#DEFINE GDIPLUS_PIXELFORMAT_4bppIndexed      0x00030402
#DEFINE GDIPLUS_PIXELFORMAT_8bppIndexed      0x00030803
#DEFINE GDIPLUS_PIXELFORMAT_16bppGrayScale   0x00101004
#DEFINE GDIPLUS_PIXELFORMAT_16bppRGB555      0x00021005
#DEFINE GDIPLUS_PIXELFORMAT_16bppRGB565      0x00021006
#DEFINE GDIPLUS_PIXELFORMAT_16bppARGB1555    0x00061007
#DEFINE GDIPLUS_PIXELFORMAT_24bppRGB         0x00021808
#DEFINE GDIPLUS_PIXELFORMAT_32bppRGB         0x00022009
#DEFINE GDIPLUS_PIXELFORMAT_32bppARGB        0x0026200A
#DEFINE GDIPLUS_PIXELFORMAT_32bppPARGB       0x000E200B
#DEFINE GDIPLUS_PIXELFORMAT_48bppRGB         0x0010300C
#DEFINE GDIPLUS_PIXELFORMAT_64bppPARGB       0x001C400E

LOCAL loVFPImg,lnWidth,lnHeight
LOCAL loImage AS GpImage OF ffc/_gdiplus.vcx
LOCAL loBitmap AS GpBitmap OF ffc/_gdiplus.vcx
LOCAL loGraphics as GpGraphics OF HOME() + ffc/_gdiplus.vcx
LOCAL lnNewWidth, lnNewHeight

* Averiguo dimensiones de la imagen original
loVFPImg = CREATEOBJECT("Image")
loVFPImg.Picture = lcImagenOri
lnWidth = loVFPImg.Width
lnHeight = loVFPImg.Height
loVFPImg = NULL

loImage = NEWOBJECT("GpImage", HOME() + "ffc/_gdiplus.vcx")
loImage.CreateFromFile(lcImagenOri)

loBitmap = NEWOBJECT("GpBitmap", HOME() + "ffc/_gdiplus.vcx")

loGraphics = NEWOBJECT('GpGraphics',HOME() + 'ffc/_gdiplus.vcx')

* Determino ancho y alto para que no se deforme la imagen resultante
IF lnWidth>lnHeight
lnNewWidth = lnAncho
lnPje=INT(lnNewWidth*100/lnWidth)
 lnNewHeight=INT(lnHeight*lnPje/100)
ELSE
lnNewHeight = lnAlto
lnPje=INT(lnNewHeight*100/lnHeight)
 lnNewWidth=INT(lnHeight*lnPje/100)
ENDIF

loBitmap.Create(lnNewWidth, lnNewHeight, GDIPLUS_PIXELFORMAT_32bppPARGB)

loGraphics.CreateFromImage(loBitmap)
loGraphics.DrawImageScaled(loImage, 0, 0, lnNewWidth, lnNewHeight)
loBitmap.SaveToFile(lcImagenDes, "image/jpeg")

Espero que a alguien mas le sirva.

Debo aclarar que yo lo hice con Jpg pero puede ser hecho con otros formatos
de imagen.

Saludos,

Pancho
Cordoba

Responder a