OPENGL做的图像怎么保存为BMP格式图像?

解决方案 »

  1.   

    用glReadPixels可以得到帧缓存中的数据,然的往位图上画就行了,不过要注意用glReadPixels得到的数据是从自底向上的。
      

  2.   

    你是要做渲染到纹理还是屏幕快照,我电脑上有例子,是C++的,发消息给我你的EMAIL,我发给你。
      

  3.   

    基本。。都c的不过你应该可以看明白。bool __fastcall GetOpenGLViewToCanvas(TCanvas *DescCanvas)
    {
      GLint            viewport[4];
      int              length,tWidth;
      bool             Result;
      //BITMAPFILEHEADER fHeader;
      BITMAPINFOHEADER iHeader;
      int              bmpFile;
      GLint            lastBuffer;   // Storage for the current read buffer setting
      glGetIntegerv(GL_VIEWPORT, viewport);  tWidth = viewport[2]*3;
      tWidth = (tWidth + 3) & (~3);   //4字节对齐
      length = tWidth * viewport[3];  if (Bits!=NULL)
          delete []Bits;
      bitlength=length;
      Bits=new unsigned char[length+1];
      glFinish();  glPixelStorei(GL_PACK_ALIGNMENT, 4);
      glPixelStorei(GL_PACK_ROW_LENGTH, 0);
      glPixelStorei(GL_PACK_SKIP_ROWS, 0);
      glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
      glReadBuffer(GL_BACK);
      glReadPixels(0, 0, viewport[2], viewport[3], GL_RGB, GL_UNSIGNED_BYTE, Bits);
      ColorsChanged = true;
      Width = viewport[2];
      Height = viewport[3];
      ColorDepth = 24;  //对当前的色素交换,
      ConvertColors();  if (Bits!=NULL)
      {
        iHeader.biSize = sizeof(BITMAPINFOHEADER);
        iHeader.biWidth = Width;
        iHeader.biHeight = Height;
        iHeader.biPlanes = 1;
        iHeader.biBitCount = ColorDepth;
        iHeader.biCompression = BI_RGB;
        iHeader.biSizeImage =   length;
        iHeader.biXPelsPerMeter=0;
        iHeader.biYPelsPerMeter=0;
        iHeader.biClrImportant=0;
        iHeader.biClrUsed=0;    struct { BITMAPINFOHEADER bih;
            RGBQUAD col[2];
            }bic;
        bic.col->rgbBlue=0;
        bic.col->rgbGreen=0;
        bic.col->rgbRed=0;
        bic.col->rgbReserved=0;
        BITMAPINFO *binf = (BITMAPINFO *)&bic;
        memcpy(&(binf->bmiHeader),&iHeader,sizeof(BITMAPINFOHEADER));
        /*
        //  ~~方法1
        //这里直接把裸图显示  [不过大图效果很差]
        StretchDIBits(DescCanvas->Handle,
                      0, 0, Width, Height,      
                      0, 0, Width, Height,
                    Bits, binf, 0, SRCCOPY);
        */
        //方法2,创建位图 ,也是模糊
        HBITMAP hbm;
        char* picData=NULL;
        // 从位图头创建一个DIB并取得指向缓冲区的指针。 ~~~图像有时候会创建出错
        hbm= CreateDIBSection(0, binf, DIB_RGB_COLORS, (void**)&picData, 0, 0);
        //拷贝数据到缓冲区
        memcpy(picData,Bits,bitlength);
        HDC memDC = CreateCompatibleDC(0);
        SelectObject(memDC, hbm);
        BitBlt(DescCanvas->Handle,0,0,Width, Height,memDC,0,0,SRCCOPY);
        ::DeleteObject(hbm);
        
        //Graphics::TBitmap*bmp=new Graphics::TBitmap;
        //bmp->Handle=hbm;
        //bmp->SaveToFile("d:\\t1.bmp");
        //DescCanvas->Draw(-1,-1,bmp);
        //delete bmp;
        
        /*
        //方法3
        HBITMAP hbm = CreateBitmap(
           Width,         // bitmap width, in pixels
           Height,        // bitmap height, in pixels
           1,       // number of color planes
           1,   // number of bits to identify color
           NULL // color data array
        );
        HDC MDC = ::CreateCompatibleDC(0);
        HBITMAP oldBmp=(HBITMAP)SelectObject(MDC,hbm);
        //设定颜色点阵
        ::SetDIBits(MDC,hbm,0,Height,Bits,binf,DIB_RGB_COLORS);
        BitBlt(DescCanvas->Handle,0,0,Width, Height,MDC,0,0,SRCCOPY);
        ::SelectObject(MDC,oldBmp);
        ::DeleteObject(hbm);
        ::DeleteDC(MDC);
        */
        Result = true;
      }
      return Result;
    }
      

  4.   

    总而言之opengl抓图。。效果并不好。
      

  5.   

    还有别的办法么,如果我要将opengl做为后台处理不能,抓不图,应该怎样处理?