bool FreeImageLoader::SaveImage(char *imgpath) { /* int img_widht,img_height; unsigned char *mpixels =new unsigned char[1024*768*4]; FREE_IMAGE_FORMAT fif =FIF_PNG; BOOL bSuccess = FALSE; glReadBuffer(GL_FRONT); glReadPixels(0, 0, 1024, 768, GL_RGBA, GL_UNSIGNED_BYTE, mpixels); glReadBuffer(GL_BACK); for(int i=0; i<(int)1024*768*4; i+=4) { //repeated xor to swap bytes mpixels[i] ^= mpixels[i+2] ^= mpixels[i] ^= mpixels[i+2]; } FIBITMAP* bitmap = FreeImage_ConvertFromRawBits(mpixels,1024,768,4096,32,8,8,8,FALSE); //FIBITMAP *dibsave = FreeImage_Load(FIF_PNG,"img/default.png", 0); //FIBITMAP *dibsave =FreeImage_Allocate(FIF_PNG,800,800,32); //img_widht=FreeImage_GetWidth(dibsave); //img_height=FreeImage_GetHeight(dibsave); bSuccess = FreeImage_Save(FIF_PNG, bitmap, "gg1.png", PNG_DEFAULT); FreeImage_Unload(bitmap); delete[] mpixels;*/ unsigned char *mpixels =new unsigned char[800*600*4]; glReadBuffer(GL_FRONT); glReadPixels(0, 0, 800, 600, GL_RGBA, GL_UNSIGNED_BYTE, mpixels); glReadBuffer(GL_BACK); for(int i=0; i<(int)800*600*4; i+=4) { mpixels[i] ^= mpixels[i+2] ^= mpixels[i] ^= mpixels[i+2]; } FIBITMAP* bitmap =FreeImage_Allocate(800,600,32,8,8,8); for(int y =0 ;y<FreeImage_GetHeight(bitmap);y++) { BYTE *bits =FreeImage_GetScanLine(bitmap,y); for(int x =0 ;x<FreeImage_GetWidth(bitmap);x++) { bits[0] =mpixels[(y*800+x)*4+0]; bits[1] =mpixels[(y*800+x)*4+1]; bits[2] =mpixels[(y*800+x)*4+2]; bits[3] =255; bits+=4; } } bool bSuccess = FreeImage_Save(FIF_PNG, bitmap,imgpath, PNG_DEFAULT); FreeImage_Unload(bitmap); return bSuccess; }
更新
2017 -4 -25
freeimage保存圖片主要幾個函數
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN; // 這個是要保存圖片的格式,可以選擇 FIF_JPEG FIF_PNG FIF_BMP 等等幾十種格式
fif = FIF_JPEG;
FIBITMAP* convertedBmp; //定義一個freeimage的數組用來保存數據
//然后我們可以遍歷圖片的寬高逐個寫入像素的值
DLL_API BOOL DLL_CALLCONV FreeImage_Save(FREE_IMAGE_FORMAT fif, FIBITMAP *dib, const char *filename, int flags FI_DEFAULT(0));
//最后這個函數就是保存圖片到文件了,第一個參數是圖片的格式,上面已經說了,第二個是數據的內容,傳剛才的bitmap就好,第三個參數是文件的名字,最后一個是圖片的質量
//下面從別的地方抄來的例子
PixelType* pixels = pix.getPixels();
unsigned int width = pix.getWidth();
unsigned int height = pix.getHeight();
unsigned int bpp = pix.getBitsPerPixel();
FREE_IMAGE_TYPE freeImageType = getFreeImageType(pix);
FIBITMAP* bmp = FreeImage_AllocateT(freeImageType, width, height, bpp);
unsigned char* bmpBits = FreeImage_GetBits(bmp);
if(bmpBits != NULL)
{
int srcStride = width * pix.getBytesPerPixel();
int dstStride = FreeImage_GetPitch(bmp);
unsigned char* src = (unsigned char*) pixels;
unsigned char* dst = bmpBits;
for(int i = 0; i < (int)height; i++)
{
memcpy(dst, src, srcStride);
src += srcStride;
dst += dstStride;
}
}