参考资料:《厦门大学计算机图像学教程》第4.1章(附代码)
一、可以使用该教程包装的类用俩个函数来实现图片的导入,
第一个函数支持导入*.BMP,*.EMF,*.GIF,*.ICO,*.JPG和*.WMF
第二个函数用来导入*.TGA格式的图片。
2、我在自己的项目使用过程中,只使用了第一个函数,并把它包装到了自己的类中。
进行了少许修改
①、删掉了“添加/和将路径拼接起来”的那部分代码,因为我的代码可以直接传递完整路径。
但将string路径转为char*用了强制转换。(char*)strFiletexData.c_str()
②、添加了保存原始图片大小变量。以便于后面在纹理映射中的使用(opengl要求纹理图片大小为1,像素坐标必须要除以图片大小)
//原始图像大小赋值
ImgageWidth=lWidthPixels;
ImgageHeight=lHeightPixels;
③、纹理的显示做了部分修改,添加了几个函数
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
附一:我改的类函数
// 载入图片并转换为纹理
BOOL CtestviewView::BuildTexture(char *szPathName, GLuint &texid)
{
MultiByteToWideChar(CP_ACP, 0, szPathName, -1, wszPath, MAX_PATH); // 把ASCII码转化为Unicode标准码
HRESULT hr = OleLoadPicturePath(wszPath, 0, 0, 0, IID_IPicture, (void**)&pPicture);
if(FAILED(hr)) // 如果导入失败
{
// 图片载入失败出错信息
MessageBox ("图片导入失败!\n(TextureLoad Failed!)", "Error", MB_OK | MB_ICONEXCLAMATION);
return FALSE; // 返回 FALSE
}
hdcTemp = CreateCompatibleDC(::GetDC(0)); // 建立窗口设备描述表
if(!hdcTemp) // 建立失败?
{
pPicture->Release(); // 释放IPicture
// 图片载入失败出错信息
MessageBox ("图片导入失败!\n(TextureLoad Failed!)", "Error", MB_OK | MB_ICONEXCLAMATION);
return FALSE; // 返回 FALSE
}
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glMaxTexDim); // 取得支持的纹理最大尺寸
pPicture->get_Width(&lWidth); // 取得IPicture 宽度 (转换为Pixels格式)
lWidthPixels = MulDiv(lWidth, GetDeviceCaps(hdcTemp, LOGPIXELSX), 2540);
pPicture->get_Height(&lHeight); // 取得IPicture 高度 (转换为Pixels格式)
lHeightPixels = MulDiv(lHeight, GetDeviceCaps(hdcTemp, LOGPIXELSY), 2540);
//原始图像大小赋值
ImgageWidth=lWidthPixels;
ImgageHeight=lHeightPixels;
// 调整图片到最好的