• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小星星的天空

            O(∩_∩)O 小月亮的fans ^_^

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              16 隨筆 :: 0 文章 :: 61 評(píng)論 :: 0 Trackbacks

                  

            首先,我們了解一下BMP的格式,BMP有四部分組成,用表格表示如下:

             

             

             

             

            1. 文件信息頭

            2. 位圖信息頭

            3. 調(diào)色板

            4. 位圖數(shù)據(jù)

             

            第一部分,文件信息頭的格式如下:

            typedef struct tagBITMAPFILEHEADER {

                    WORD    bfType;

                    DWORD   bfSize;

                    WORD    bfReserved1;

                    WORD    bfReserved2;

                    DWORD   bfOffBits;

            } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

            共有14個(gè)字節(jié),其中bfType為文件類型,BMP的類型為0×4d42,也就是字母mbbfSize是文件大小,為1234部分大小的總和;bfReserved1bfReserved2123部分大小的總和。

             

            第二部分,位圖信息頭,定義如下:

            typedef struct tagBITMAPINFOHEADER{

                    DWORD      biSize;

                    LONG       biWidth;

                    LONG       biHeight;

                    WORD       biPlanes;

                    WORD       biBitCount;

                    DWORD      biCompression;

                    DWORD      biSizeImage;

                    LONG       biXPelsPerMeter;

                    LONG       biYPelsPerMeter;

                    DWORD      biClrUsed;

                    DWORD      biClrImportant;

            } BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

            總共40個(gè)字節(jié),字段比較多,可以查看MSDN中的說明,對(duì)于RGB24的位圖,這個(gè)結(jié)構(gòu)體一般定義如下:

            BITMAPINFOHEADER bih;

                   bih.biSize = sizeof(BITMAPINFOHEADER);

                   bih.biWidth = width;

                   bih.biHeight = height;

                   bih.biPlanes = 1;

                   bih.biBitCount = 24;

                   bih.biCompression = 0;

                   bih.biSizeImage = size;

                   bih.biXPelsPerMeter = 0;

                   bih.biYPelsPerMeter = 0;

                   bih.biClrUsed = 0;

                   bih.biClrImportant = 0;

             

            第三部分是調(diào)色板信息,定義如下:

            typedef struct tagRGBQUAD {

                    BYTE    rgbBlue;

                    BYTE    rgbGreen;

                    BYTE    rgbRed;

                    BYTE    rgbReserved;

            } RGBQUAD;

            這部分用來表示RGB各色的強(qiáng)度,一般情況我們不把這一部分寫到文件中。

             

            第四部分就是真正的數(shù)據(jù),比如寬度和高度分別是320240,這部分?jǐn)?shù)據(jù)的長度應(yīng)該為320*240*3(每個(gè)像素點(diǎn)上有3個(gè)字節(jié),分別用來表示b,g,r的顏色)。

             

            根據(jù)對(duì)BMP格式的說明,我們可以輕易的寫出一個(gè)生成BMP圖像的函數(shù),如下所示:


            void saveBmp(const char* name ,int width,int height, unsigned char* data)
            {
             BMPHeader hdr;
             BMPInfoHeader infoHdr;
             int x, y;

             infoHdr.size = 40;
             infoHdr.width = width;
             infoHdr.height = height;
             infoHdr.planes = 1;
             infoHdr.bitsPerPixel = 24;
             infoHdr.compression = 0;
             infoHdr.imageSize =width* height * 3;
             infoHdr.xPelsPerMeter = 0;
             infoHdr.yPelsPerMeter = 0;
             infoHdr.clrUsed = 0;
             infoHdr.clrImportant = 0;

             hdr.type = 0x4D42;
             hdr.reserved1 = 0;
             hdr.reserved2 = 0;
             hdr.offset = 54;
             hdr.size =(DWORD)(sizeof(BMPHeader)+sizeof(BMPInfoHeader)+width* height * 3);


             FILE *fd;

             if( !(fd = fopen(name,"wb+")) )
             {
              printf("***BMP load error: file access denied***\n");
              exit(0);
             }
             fwrite(&hdr,1,sizeof(BMPHeader),fd);
             fwrite(&infoHdr,1,sizeof(BMPInfoHeader),fd);
             fwrite(data,1,width* height * 3,fd);
             fclose(fd);

            }


             從opengl中讀取場景也很簡單,就是個(gè)函數(shù)就搞定,廢話少說,直接上代碼:

            void
            saveSceneImage()
            {
             GLint pView[4];
             glGetIntegerv(GL_VIEWPORT,pView);

             GLsizei numComponet = 3;
             GLsizei bufferSize = pView[2]*pView[3]*sizeof(GLfloat)*numComponet;
             GLfloat* _data = new GLfloat[bufferSize];
             unsigned char*  data = new unsigned char[bufferSize];
             

             glReadPixels(pView[0],pView[1],pView[2],pView[3],GL_RGB,GL_FLOAT,_data);

             for (int i = 0 ; i <bufferSize ; i ++)
             {
              {
               data[i] = _data[i] * 256;
              }
             }
             saveBmp("1.bmp",pView[2],pView[3],data);
             delete[] data;
             delete[] _data;

            }

             

            有哪位朋友有更好的方法,歡迎討論

            posted on 2009-06-02 23:54 Little Star 閱讀(3913) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Computer Graphics

            評(píng)論

            # re: opengl場景保存成BMP文件 2009-06-03 13:42 巫云
            有了這個(gè)格式表就可以自己生成bmp啦,吔  回復(fù)  更多評(píng)論
              

            色综合久久中文色婷婷| 久久人人妻人人爽人人爽| 91亚洲国产成人久久精品| 久久成人18免费网站| 无码人妻少妇久久中文字幕 | 久久天天躁夜夜躁狠狠| 色综合久久久久无码专区| 久久这里只有精品首页| 人人妻久久人人澡人人爽人人精品| 亚洲va久久久噜噜噜久久男同| 老司机国内精品久久久久| 国产99久久久国产精品小说| 精品国产福利久久久| 伊人色综合久久天天人守人婷 | 无码日韩人妻精品久久蜜桃| 久久777国产线看观看精品| 青春久久| 情人伊人久久综合亚洲| 久久久久久精品免费看SSS| 久久精品人妻一区二区三区| 婷婷伊人久久大香线蕉AV| 精品久久久久久国产牛牛app| 7777精品久久久大香线蕉| 国产午夜电影久久| 久久人妻少妇嫩草AV无码专区| 欧美亚洲另类久久综合婷婷| 久久精品国产福利国产秒| 亚洲综合伊人久久大杳蕉| 少妇久久久久久被弄到高潮 | 亚洲中文字幕无码久久精品1| 久久久久亚洲AV成人网人人网站| 久久99精品久久久久久久不卡 | 国产高潮久久免费观看| 久久久噜噜噜久久中文福利| 精品久久久无码21p发布| 久久精品国产WWW456C0M| 国产精品伊人久久伊人电影| 青青青国产精品国产精品久久久久| 久久久一本精品99久久精品66| 久久久久久久精品妇女99| 无码任你躁久久久久久老妇App|