• <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>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            CxImage與OpenGL結(jié)合

            From:http://www.physdev.com/phpbb/cms_view_article.php?aid=30
            關(guān)于CxImage的文章,網(wǎng)上有許多,這里只介紹如何把CxImage與OpenGL結(jié)合起來,用于讀入多種格式的紋理以及用來把屏幕保存為各種格式的圖像文件。

            支持的格式有:BMP,GIF,ICO,JP2,FPC,FPG,PCX,PNG,PNM,RAS,TGA,TIF等等。

            支持讀入透明紋理。

            CxImage官方網(wǎng)站:
            http://www.xdp.it/

            //使用CxImage來為OpenGL讀入多種格式的紋理
            //CxImage是一個開源的圖片處理函數(shù)庫,支持的文件格式有:
            //CXIMAGE_FORMAT_BMP
            //CXIMAGE_FORMAT_GIF
            //CXIMAGE_FORMAT_ICO
            //CXIMAGE_FORMAT_JP2
            //CXIMAGE_FORMAT_JPC
            //CXIMAGE_FORMAT_JPG
            //CXIMAGE_FORMAT_PCX
            //CXIMAGE_FORMAT_PGX
            //CXIMAGE_FORMAT_PNG
            //CXIMAGE_FORMAT_PNM
            //CXIMAGE_FORMAT_RAS
            //CXIMAGE_FORMAT_TGA
            //CXIMAGE_FORMAT_TIF
            //CXIMAGE_FORMAT_UNKNOWN
            //CXIMAGE_FORMAT_WBMP
            //CXIMAGE_FORMAT_WMF
            //們知道OpenGL自帶有讀取圖形文件作紋理的函數(shù),但功能很弱,只支持BMP圖片
            //如果要讀取其它格式的紋理,就需要用到第三方函數(shù)庫了。這里我們介紹CxImage
            //CxImage下載:www.xdp.it
            //以下代碼是用來讀取JPG文件的,緊供參考。

            //讀入紋理,支持讀入一個alpha紋理,alpha紋理的大小必須與原圖一至。
            //LoadTexture("pic.jpg",NULL,resultID); //讀入單個JPG圖片作紋理
            //LoadTexture("pic.jpg","pic_alpha.jpg",resultID); //讀入一個紋理圖,及一個用于透明過濾的alpha圖
            //LoadTexture("pic.png",NULL,resultID) //讀入一個自身帶有透明信息的圖片作紋理。

            bool CCxImage_GLView::LoadTexture(const char *tex_name, const char *alpha_name, unsigned int &texID) 

               
            // TODO: Add your command handler code here 
               CxImage image ,alpha,blendTex;// 


               unsigned 
            char *pImage_RGBA = NULL; 


               
            // Load the bitmap using the aux function stored in glaux.lib 
               
            //pImage = auxDIBImageLoad(tex_name); 
               image.Load(tex_name); 
               
            // Make sure valid image data was given to pImage, otherwise return false 
               if(!image.IsValid()) 
                  
            return false

               
            int sizeX,sizeY; 
               sizeX 
            = image.GetWidth(); 
               sizeY 
            = image.GetHeight(); 

               
            float texAspectRatio = (float)sizeX / (float)sizeY; 





               
            if(alpha_name && strlen(alpha_name) > 0 ) 
               

                     
            int imageSize_RGB  = sizeX * sizeY * 3
                     
            int imageSize_RGBA = sizeX * sizeY * 4
                     alpha.Load(alpha_name);    
                     
            if(!alpha.IsValid()) 
                     

                        
            return false
                     }
             
                     
            // allocate buffer for a RGBA image 
                     pImage_RGBA = new unsigned char[imageSize_RGBA]; 
                   

                     RGBQUAD col_image,col_alpha; 
                      
                  
            for(int y=0;y<sizeY;y++
                     
            for(int x=0;x<sizeX;x++
                        

                           col_image 
            = image.GetPixelColor(x,y,false); 
                           col_alpha 
            = alpha.GetPixelColor(x,y,false); 
                           pImage_RGBA[(x
            +y*sizeX)*4 +0= col_image.rgbRed; 
                           pImage_RGBA[(x
            +y*sizeX)*4 +1= col_image.rgbGreen; 
                           pImage_RGBA[(x
            +y*sizeX)*4 +2= col_image.rgbBlue; 
                           pImage_RGBA[(x
            +y*sizeX)*4 +3= col_alpha.rgbRed; 
                        }
             


                      

                     glGenTextures(
            1&texID); 
                     glBindTexture(GL_TEXTURE_2D, texID); 

                     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
                     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
                     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);    
                     
            // Don't forget to use GL_RGBA for our new image data we support Alpha transparency now! 
                  
            // Build Mipmaps (builds different versions of the picture for distances - looks better) 
                     gluBuild2DMipmaps(GL_TEXTURE_2D, 4, sizeX, 
                        sizeY, GL_RGBA, GL_UNSIGNED_BYTE, pImage_RGBA);    
                  
            if(pImage_RGBA) 
                  

                     delete [] pImage_RGBA; 
                  }
             

               }
             
               
            else if(image.AlphaIsValid()) 
               

                     
            int imageSize_RGB  = sizeX * sizeY * 3
                     
            long imageSize_RGBA = sizeX * sizeY * 4
                     
            // allocate buffer for a RGBA image 
                  
            //   pImage_RGBA = new unsigned char[imageSize_RGBA]; 

                  image.Encode2RGBA(pImage_RGBA,imageSize_RGBA); 
                   
                  
            // Generate a texture with the associative texture ID stored in the array 
                  glGenTextures(1&texID); 
                   
                  
            // This sets the alignment requirements for the start of each pixel row in memory. 
                  
            //   glPixelStorei (GL_UNPACK_ALIGNMENT, 1); 
                   
                  
            // Bind the texture to the texture arrays index and init the texture 
                  glBindTexture(GL_TEXTURE_2D, texID); 
                   

                  
            //Assign the mip map levels and texture info 
                  
            //   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 
                  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
                  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
                  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
                  
            // Build Mipmaps (builds different versions of the picture for distances - looks better) 
                  gluBuild2DMipmaps(GL_TEXTURE_2D, 4, sizeX, 
                        sizeY, GL_RGBA, GL_UNSIGNED_BYTE, pImage_RGBA);    
                   
                  image.FreeMemory( pImage_RGBA); 
               }
             
               
            else 
               

                  
            // Generate a texture with the associative texture ID stored in the array 
                  glGenTextures(1&texID); 
                   
                  
            // This sets the alignment requirements for the start of each pixel row in memory. 
                  
            //   glPixelStorei (GL_UNPACK_ALIGNMENT, 1); 
                   
                  
            // Bind the texture to the texture arrays index and init the texture 
                  glBindTexture(GL_TEXTURE_2D, texID); 
                   

                  
            //Assign the mip map levels and texture info 
                  
            //   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST); 
                  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
                  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
                  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
                  
            // Build Mipmaps (builds different versions of the picture for distances - looks better) 
                  gluBuild2DMipmaps(GL_TEXTURE_2D, 3, sizeX, 
                     sizeY, GL_BGR_EXT, GL_UNSIGNED_BYTE, image.GetBits()); 
                   
               }
             
               
            //glEnable(GL_TEXTURE_2D); 
               
            // Now we need to free the image data that we loaded since openGL stored it as a texture 





               
            return true
            }
             

            //用來保存屏幕到圖像文件。
            void CCxImage_GLView::OnSaveScene() 



               
            // TODO: Add your command handler code here 
               static char BASED_CODE szFilter[] = "jpg Files (*.jpg)|*.jpg|bmp Files (*.bmp)|*.bmp|tga Files (*.tga)|*.tga|All Files (*.*)|*.*||"
              

               CString filename; 
                
               CString ext 
            = ""

               
            if(filename.IsEmpty()) 
                  filename 
            = "NoName"

               CFileDialog dlg(
            false"jpg",filename, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter); 

               
            if(dlg.DoModal() == IDOK) 
               


               ext 
            = dlg.GetFileExt(); 
               filename 
            = dlg.GetPathName(); 


                  
            //CDC* m_pDC;                  // Windows設(shè)備描述表 
                  
            //HGLRC m_hRC;               // OpenGL渲染描述表 

                  
            // TODO: Add your command handler code here 
                  wglMakeCurrent(m_pDC->m_hDC,m_hRC); 
                  
            //這里要注意,如果就面渲染完畢的時候,調(diào)用了wglMakeCurrent(NULL,NULL);上面一行就一定要加上。 




                  
            int expand = 0
                  
            if((m_width *3)%4
                     expand 
            = 4 - (m_width*3)%4;   //保證位圖寬度能被4整除 
                   
                  
            int mapSize = (m_width*3 +expand) * (m_height); 

                  
            if(mapSize == 0
                     
            return

                  
            //hDIB = (HGLOBAL) ::GlobalAlloc(GHND,mapSize); 
                  unsigned char * pTmp = new BYTE[mapSize]; 

                  
            if(!pTmp) 
                     
            return ; 
                  
            // 讀取屏幕像素 
                  glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
                  glReadPixels(
            00, m_width, m_height, GL_BGR_EXT, GL_UNSIGNED_BYTE, pTmp); 
               
            //   glPixelStorei(GL_PACK_ALIGNMENT, 1); 



                  
            // BMP信息頭 
                  CxImage image; 
                  
            //image.CreateFromHBITMAP(hbit); 
                  image.CreateFromArray(pTmp,m_width,m_height,24,m_width*3 + expand,false); 
                  image.SetJpegQuality(
            98);      //指定JPG文件的質(zhì)量(0-100) 
                   
                  
            if(ext == "jpb"
                     image.Save(filename,CXIMAGE_FORMAT_JPG); 
                  
            else if(ext == "bmp"
                     image.Save(filename,CXIMAGE_FORMAT_BMP); 
                  
            else if(ext == "tga"
                     image.Save(filename,CXIMAGE_FORMAT_TGA); 

                  
            //pFile->Write(pTmp,mapSize*3); 



                  delete[] pTmp; 

               }
             

                
            }

            posted on 2007-04-09 21:58 楊粼波 閱讀(1798) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久亚洲国产成人影院| 久久久久久青草大香综合精品| 久久99精品国产麻豆蜜芽| 久久久女人与动物群交毛片| 国产精品一区二区久久精品涩爱| 狠狠色综合网站久久久久久久| 久久久久99精品成人片欧美| 中文字幕乱码人妻无码久久| 亚洲婷婷国产精品电影人久久| 久久精品人妻一区二区三区| 99久久精品九九亚洲精品| 99久久www免费人成精品| 国产精品久久久久久搜索| 久久精品国产亚洲av麻豆小说| 中文字幕人妻色偷偷久久 | 亚洲国产精品18久久久久久| 亚洲精品国精品久久99热| 久久久久久无码国产精品中文字幕| 国产成人精品久久综合| 久久久精品视频免费观看 | 精品久久久久久久国产潘金莲| 中文字幕无码久久人妻| 99精品久久久久久久婷婷| 久久er99热精品一区二区| 久久国产乱子精品免费女| 国产精品综合久久第一页| 久久综合伊人77777| 久久久精品久久久久影院| 午夜久久久久久禁播电影| 精品无码久久久久久尤物| 久久国产精品久久| 久久夜色精品国产www| 久久久久亚洲AV无码专区首JN | 成人精品一区二区久久| 伊人久久五月天| 久久精品国产第一区二区三区| 九九99精品久久久久久| 欧美与黑人午夜性猛交久久久 | 性做久久久久久久久浪潮| 欧美一区二区三区久久综| 99热成人精品免费久久|