FreeImage_GetScanLine
DLL_API BYTE *DLL_CALLCONV FreeImage_GetScanLine(FIBITMAP *dib, int scanline);
Devuelve un puntero al comienzo de la línea de pixels (scanline) dada dentro de los datos de bits del mapa de bits.
Te corresponde a ti interpretar esos bytes correctamente, de acuerdo con el resultado de FreeImage_GetBPP y FreeImage_GetImageType (ver el ejemplo a continuación).
Cuando se trabaja con tipos de imagen FIT_INT32 o FIT_UINT32, se debe castear el resultado de FreeImage_GetScanLine con el respectivo tipo de datos LONG o DWORD, respectivamente. Esto es porque el tamaño de un long es 32-bit bajo Windows y de 64-bit bajo Unix o Linux.
Usar tipos de datos LONG o DWORD asegura que estás trabajando con tipos de 32-bit, independientemente de la plataforma.
Nota: FreeImage_GetScanLine retornará NULL si el mapa de bits no contiene datos de pixels (es decir si sólo contiene la cabecera y posiblemente alguno o todos los metadatos). Ver también FreeImage_HasPixels.
// this code assumes there is a bitmap loaded and
// present in a variable called ‘image’
unsigned x, y;
FREE_IMAGE_TYPE image_type = FreeImage_GetImageType(image);
// test pixel access
switch(image_type) {
case FIT_BITMAP:
if(FreeImage_GetBPP(image) == 8) {
for(y = 0; y < FreeImage_GetHeight(image); y++) {
BYTE *bits = (BYTE *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
}
break;
case FIT_UINT16:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
unsigned short *bits = (unsigned short *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_INT16:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
short *bits = (short *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_UINT32:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
DWORD *bits = (DWORD *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_INT32:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
LONG *bits = (LONG *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_FLOAT:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
float *bits = (float *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_DOUBLE:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
double *bits = (double *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x] = 128;
}
}
break;
case FIT_COMPLEX:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
FICOMPLEX *bits = (FICOMPLEX *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x].r = 128;
bits[x].i = 128;
}
}
break;
case FIT_RGB16:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
FIRGB16 *bits = (FIRGB16 *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x].red = 128;
bits[x].green = 128;
bits[x].blue = 128;
}
}
break;
case FIT_RGBF:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
FIRGBF *bits = (FIRGBF *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x].red = 128;
bits[x].green = 128;
bits[x].blue = 128;
}
}
break;
case FIT_RGBA16:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
FIRGBA16 *bits = (FIRGBA16 *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x].red = 128;
bits[x].green = 128;
bits[x].blue = 128;
bits[x].alpha = 128;
}
}
break;
case FIT_RGBAF:
for(y = 0; y < FreeImage_GetHeight(image); y++) {
FIRGBAF *bits = (FIRGBAF *)FreeImage_GetScanLine(image, y);
for(x = 0; x < FreeImage_GetWidth(image); x++) {
bits[x].red = 128;
bits[x].green = 128;
bits[x].blue = 128;
bits[x].alpha = 128;
}
}
break;
}