经验证,图片保存部分代码没有问题,问题好像处在了读取数据的部分,但是始终看不出错误在哪?请大家多多指教!部分代码如下:
g_width=r-l;
g_height=t-b; FILE*    pDummyFile;
FILE*    pWritingFile;
GLubyte* pPixelData;
GLubyte  BMP_Header[54];
GLint    i, j;
GLint    PixelDataLength;
// 计算像素数据的实际长度
i = g_width * 3;   // 得到每一行的像素数据长度
while( i%4 != 0 )      
++i;              
          PixelDataLength = i * g_height;
// 分配内存和打开文件
pPixelData = (GLubyte*)malloc(PixelDataLength);
if( pPixelData == 0 )
exit(0);
pDummyFile = fopen("dummy.bmp", "rb");
if( pDummyFile == 0 )
exit(0);
pWritingFile = fopen("grab.bmp", "wb");
if( pWritingFile == 0 )
exit(0);
// 读取像素
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glReadPixels(0, 0, g_width, g_height, GL_BGR_EXT, GL_UNSIGNED_BYTE, pPixelData);
// 把dummy.bmp的文件头复制为新文件的文件头
fread(BMP_Header, sizeof(BMP_Header), 1, pDummyFile);
fwrite(BMP_Header, sizeof(BMP_Header), 1, pWritingFile);
fseek(pWritingFile, 0x0012, SEEK_SET);
i = g_width;
j = g_height;
fwrite(&i, sizeof(i), 1, pWritingFile);
fwrite(&j, sizeof(j), 1, pWritingFile);
// 写入像素数据
fseek(pWritingFile, 0, SEEK_END);
fwrite(pPixelData, PixelDataLength, 1, pWritingFile);
// 释放内存和关闭文件
fclose(pDummyFile);
fclose(pWritingFile);
free(pPixelData);

解决方案 »

  1.   

    http://blog.csdn.net/dreamcs/article/details/6052984
    你可以看看这篇文章
      

  2.   

    #include "WINDOWSX.H" CClientDC SHDC(this);//取得客户区内存DC
     CPaintDC   dc(this);
     CDC memDC;
     CRect rect;
     GetClientRect(rect); memDC.CreateCompatibleDC(&SHDC);
     CBitmap bm;
     int Width = rect.Width();//
     int Height = rect.Height();//
     bm.CreateCompatibleBitmap(&SHDC, Width, Height);
     CBitmap*  pOld = memDC.SelectObject(&bm);
     memDC.BitBlt(0, 0, Width, Height, &SHDC, 0, 0, SRCCOPY);
     memDC.SelectObject(pOld);
     BITMAP  btm;
     bm.GetBitmap(&btm);
     DWORD  size = btm.bmWidthBytes * btm.bmHeight;
     LPSTR lpData =(LPSTR)GlobalAllocPtr(GPTR, size);
     BITMAPFILEHEADER   bfh;
    /////////////////////////////////////////////
     BITMAPINFOHEADER  bih;
     bih.biBitCount = btm.bmBitsPixel;
     bih.biClrImportant = 0;
     bih.biClrUsed = 0;
     bih.biCompression = 0;
     bih.biHeight = btm.bmHeight;
     bih.biPlanes = 1;
     bih.biSize = sizeof(BITMAPINFOHEADER);
     bih.biSizeImage = size;
     bih.biWidth = btm.bmWidth;
     bih.biXPelsPerMeter = 0;
     bih.biYPelsPerMeter = 0;
     GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
     bfh.bfReserved1 = bfh.bfReserved2 = 0;
     bfh.bfType = ((WORD)('M'<< 8)|'B');
     bfh.bfSize = 54 + size;
     bfh.bfOffBits = 54; CFileDialog dlg(false,_T("BMP"),_T("*.bmp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,_T("*.bmp|*.bmp|*.*|*.*|"));
     if (dlg.DoModal()==IDOK)
     {
      CFile  bf;
      CString ss=dlg.GetPathName();
      if(bf.Open(ss, CFile::modeCreate | CFile::modeWrite))
      {
       bf.WriteHuge(&bfh, sizeof(BITMAPFILEHEADER));
       bf.WriteHuge(&bih, sizeof(BITMAPINFOHEADER));
       bf.WriteHuge(lpData, size);
       bf.Close();
      }
      GlobalFreePtr(lpData);
     }上面是保存的代码,但不是opengl的
      

  3.   

    DWORD  size = btm.bmWidthBytes * btm.bmHeight;这里是不是应该为 btm.bmWidthBytes * btm.bmHeight*3
      

  4.   

    如果不是openGL截图,就会把覆盖在客户去上的图像也截取下来,我就是想把这个地方改进一下,请问有什么方法