Opengl Freeimage 保存屏幕像素到圖片


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







 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM