CxImage与OpenGL结合
来源:互联网 发布:windows动态桌面 编辑:程序博客网 时间:2024/06/05 16:12
From:http://www.physdev.com/phpbb/cms_view_article.php?aid=30
关于CxImage的文章,网上有许多,这里只介绍如何把CxImage与OpenGL结合起来,用于读入多种格式的纹理以及用来把屏幕保存为各种格式的图像文件。
支持的格式有:BMP,GIF,ICO,JP2,FPC,FPG,PCX,PNG,PNM,RAS,TGA,TIF等等。
支持读入透明纹理。
CxImage官方网站:http://www.xdp.it/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- bool CCxImage_GLView::LoadTexture(const char *tex_name, const char *alpha_name, unsigned int &texID)
- {
-
- CxImage image ,alpha,blendTex;
-
- unsigned char *pImage_RGBA = NULL;
-
-
-
- image.Load(tex_name);
-
- 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;
- }
-
- 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);
-
-
- 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;
-
-
-
- image.Encode2RGBA(pImage_RGBA,imageSize_RGBA);
-
-
- glGenTextures(1, &texID);
-
-
-
-
-
- glBindTexture(GL_TEXTURE_2D, texID);
-
-
-
- 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);
-
- gluBuild2DMipmaps(GL_TEXTURE_2D, 4, sizeX, sizeY, GL_RGBA, GL_UNSIGNED_BYTE, pImage_RGBA);
-
- image.FreeMemory( pImage_RGBA);
- }
- else
- {
-
- glGenTextures(1, &texID);
-
-
-
-
-
- glBindTexture(GL_TEXTURE_2D, texID);
-
-
-
- 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);
-
- gluBuild2DMipmaps(GL_TEXTURE_2D, 3, sizeX,
- sizeY, GL_BGR_EXT, GL_UNSIGNED_BYTE, image.GetBits());
- }
-
-
-
- return true;
- }
-
- void CCxImage_GLView::OnSaveScene()
- {
-
- 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();
-
-
-
-
-
- wglMakeCurrent(m_pDC->m_hDC,m_hRC);
-
-
- int expand = 0;
- if((m_width *3)%4)
- expand = 4 - (m_width*3)%4;
-
- int mapSize = (m_width*3 +expand) * (m_height);
-
- if(mapSize == 0)
- return;
-
-
- unsigned char * pTmp = new BYTE[mapSize];
-
- if(!pTmp)
- return ;
-
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glReadPixels(0, 0, m_width, m_height, GL_BGR_EXT, GL_UNSIGNED_BYTE, pTmp);
-
-
-
- CxImage image;
-
- image.CreateFromArray(pTmp,m_width,m_height,24,m_width*3 + expand,false);
- image.SetJpegQuality(98);
-
- 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);
-
-
-
- delete[] pTmp;
- }
- }
http://www.cppblog.com/tx7do/archive/2007/04/09/21554.html
0 0