2017-04-01 3 views
0

Comme indiqué dans le titre, j'utilise FreeImage pour charger des textures dans mon jeu OpenGL, mais comment obtenir des sous-images?Comment obtenir une sous-image avec FreeImage

Mon code actuel ressemble à ceci:

FREE_IMAGE_FORMAT fif = FIF_UNKNOWN; 
    FIBITMAP* dib = nullptr; 
    fif = FreeImage_GetFileType(filename, 0); 
    if (fif == FIF_UNKNOWN) 
     fif = FreeImage_GetFIFFromFilename(filename); 
    if (fif == FIF_UNKNOWN) 
     return nullptr; 

    if (FreeImage_FIFSupportsReading(fif)) 
     dib = FreeImage_Load(fif, filename); 
    if (!dib) 
     return nullptr; 

    BYTE* pixels = FreeImage_GetBits(dib); 
    *width = FreeImage_GetWidth(dib); 
    *height = FreeImage_GetHeight(dib); 
    *bits = FreeImage_GetBPP(dib); 

    int size = *width * *height * (*bits/8); 
    BYTE* result = new BYTE[size]; 
    memcpy(result, pixels, size); 
    FreeImage_Unload(dib); 
    return result; 

Qu'aurais-je besoin de changer pour obtenir le sous-image (par exemple une zone de pixels dans 32x32 le coin en haut à gauche)?

Répondre

1

Vous pouvez utiliser FreeImage_Copy() pour obtenir une sous-image d'une région spécifiée. Notez que FreeImage_Copy() prend left, top, right, bottom et non x, y, width, height.

FIBITMAP *image = ...; 

int x = 0; 
int y = 0; 
int width = 32; 
int height = 32; 

FIBITMAP *subimage = FreeImage_Copy(image, x, y, x + width, y + height); 

Souvenez-vous de FreeImage_Unload(subimage) comme il est une copie littérale de l'image donnée.

Si nécessaire, vous pouvez ensuite l'enregistrer dans un fichier PNG en faisant:

if (FreeImage_Save(FIF_PNG, subimage, "subimage.png")) 
    printf("Subimage successfully saved!\n"); 
else 
    printf("Failed saving subimage!\n");