2017-04-01 49 views
0

正如标题所述,我使用FreeImage在我的OpenGL游戏中加载纹理,但是如何获取子图像?如何使用FreeImage获取子图像

我当前的代码如下所示:

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; 

什么会,我需要改变,以获得子图像(例如像素的32×32区域的左上角)?

回答

1

您可以使用FreeImage_Copy()来获取指定区域的子图像。请注意,FreeImage_Copy()需要left, top, right, bottom而不是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); 

记住FreeImage_Unload(subimage),因为它是给定图像的文字拷贝。

如果需要的话,那么你可以将其保存为PNG做:

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