Una vez más Cesar Chalom nos regala un código para el tratamiento de imágenes. En este caso se trata de recortar la imagen en tres partes, esquina superior izquierda, el centro y la esquina inferior izquierda.
Recortar imágenes con GDI+
Artículo original: CROP IMAGES WITH GDI+
http://weblogs.foxite.com/cesarchalom/archive/2006/05/25/1581.aspx
Autor: Cesar Chalom (http://weblogs.foxite.com/cesarchalom)
Traducido por: Ana María Bisbé York (amby@telefonica.net)
Para: PortalFox (http://www.portalfox.com)
Este post va dirigido a Malcolm Greene ... :)
Recortar imágenes es una tarea sencilla para GDI+.
Una de las formas que se puede hacer es utilizando la función GdipCloneBitmapAreaI, que desafortunadamente no se incluyó en _gdiplus.vcx; pero que se puede acceder fácilmente.
Imagen original 
Superior izquierda 
Centro 
Inferior derecha 
Ejecute el código siguiente, seleccione cualquier imagen, y podrá ver la imagen recortada en tres vías: la parte superior izquierda de la imagen, la parte inferior derecha y el centro.
LOCAL lcSource
lcSource = GETPICT()
IF EMPTY(lcSource)
RETURN
ENDIF
* Cargar la imagen a Gdiplus
LOCAL loImage AS GpImage OF HOME() + ffc/_gdiplus.vcx
loImage = NEWOBJECT("GpImage",HOME()+"ffc/_gdiplus.vcx")
loImage.CreateFromFile(lcSource)
lnWidth = loImage.ImageWidth
lnHeight = loImage.ImageHeight
* Recortar imagen
LOCAL loCropped AS GpBitmap OF HOME() + ffc/_gdiplus.vcx
* Recortar parte superior izquierda
loCropped = Crop(loImage, 0, 0, lnWidth / 2, lnHeight /2)
loCropped.SavetoFile("Crop-TopLeft.png","image/png")
RUN /N explorer.EXE Crop-TopLeft.png
* Recortar parte inferior izquierda
loCropped = Crop(loImage, lnWidth / 2, lnHeight /2, lnWidth /2, lnHeight /2)
loCropped.SavetoFile("Crop-BottomRight.png","image/png")
RUN /N explorer.EXE Crop-bottomright.png
* Parte central
loCropped = Crop(loImage, lnWidth / 4, lnHeight /4, lnWidth /2, lnHeight /2)
loCropped.SavetoFile("Crop-Center.png","image/png")
RUN /N explorer.EXE Crop-CENTER.png
RETURN
PROCEDURE Crop(toImage, x, Y, tnWidth, tnHeight, tnPixelFormat)
IF VARTYPE(tnPixelFormat) = "L"
tnPixelFormat = toImage.PixelFormat
ENDIF
* GpStatus WINGDIPAPI GdipCloneBitmapAreaI
* (INT x, INT y, INT width, INT height, PixelFormat format,
* GpBitmap *srcBitmap, GpBitmap **dstBitmap)
DECLARE LONG GdipCloneBitmapAreaI IN GDIPLUS.dll ;
LONG x, LONG Y, LONG nWidth, LONG nHeight, ;
LONG PixelFormat, LONG srcBitmap, LONG @dstBitmap
LOCAL lnNewBitmap
lnNewBitmap = 0
= GdipCloneBitmapAreaI(x, Y, tnWidth, tnHeight, ;
tnPixelFormat, toImage.GetHandle(), @lnNewBitmap)
LOCAL loNewImage
loNewImage = NEWOBJECT("GpBitmap",HOME()+"ffc/_gdiplus.vcx")
loNewImage.SetHandle(lnNewBitmap)
RETURN loNewImage
ENDPROC
Para lograr esto, he creado un pequeño procedimiento, "crop" (recortar), que recibe los siguientes parámetros desde MSDN:
toImage - objeto Image o Bitmap
X - Valor entero que especifica la coordenada x para la esquina superior izquierda del rectángulo que especifica la porción del bitmap a copiar.
Y - Valor entero que especifica la coordenada y para la esquina superior izquierda del rectángulo que especifica la porción del bitmap a copiar.
Width - Valor entero que especifica el ancho del rectángulo que especifica la porción del bitmap a copiar.
Height - Valor entero que especifica la altura del rectángulo que especifica la porción del bitmap a copiar.
Format - opcional, valor entero que especifica el formato pixel del nuevo bitmap. El tipo de dato PixelFormat y las constantes que representan varios formatos pixels se definen en Gdiplus.h. Para más información sobre las constantes del formato pixel, vea Image Pixel Format Constants.
Valor que devuelve - Este método devuelve un puntero al nuevo objeto Bitmap que contiene la imagen recortada.
|