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; }