freeimage.h

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