OpenGL中x64 debug下bmp图像导入出错解决方案
2015-11-16 19:03
316 查看
在win32环境下,已经提供了GLAUX库,但对于x64位,基本上该库没有提供64为支持。会出现以下错误:
------ 已启动生成: 项目: OpenGL, 配置: Debug x64 ------
1> OpenGL.cpp
1>OpenGL.cpp(746): warning C4244: “return”: 从“WPARAM”转换到“int”,可能丢失数据
1>OpenGL.obj : error LNK2019: 无法解析的外部符号 auxDIBImageLoadA,该符号在函数 "struct _AUX_RGBImageRec * __cdecl LoadBMP(char *)" (?LoadBMP@@YAPEAU_AUX_RGBImageRec@@PEAD@Z) 中被引用
1>F:\OpenGL\x64\Debug\OpenGL.exe : fatal error LNK1120: 1 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
对此研究了一下午,并没有什么重大发现;所以索性自己写了一个加载bmp的函数,考虑到上下的兼容性。在此我用到了AUX_RGBImageRec结构,其实就是一个结构体,不愿意用的话可以自己重写一下,具体如下:
typedef struct _AUX_RGBImageRec {
GLint sizeX, sizeY;
unsigned char *data;
} AUX_RGBImageRec;
自己写的bmp函数如下:
//自定义加载bmp文件
AUX_RGBImageRec * LoadBMP(char *Filename)
{
unsigned int Texture;
AUX_RGBImageRec * tex_result=new AUX_RGBImageRec; //be careful
FILE* img = NULL;
img = fopen(Filename, "r");
GLint bWidth = 0;
GLint bHeight = 0;
DWORD size = 0;
fseek(img, 18, SEEK_SET);
fread(&bWidth, 4, 1, img);
fread(&bHeight, 4, 1, img);
fseek(img, 0, SEEK_END);
size = ftell(img) - 54;
unsigned char *data = (unsigned char*)malloc(size);
fseek(img, 54, SEEK_SET); // image data
fread(data, size, 1, img);
fclose(img);
glGenTextures(1, &Texture);
glBindTexture(GL_TEXTURE_2D, Texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bWidth, bHeight, GL_BGRA, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
tex_result->sizeX = bWidth;
tex_result->sizeY = bHeight;
tex_result->data = data;
// if (data)
// free(data);
return tex_result;
}此处有几个需要注意是地方:
(1)注意像素格式,是GL_BGRA、GL_RGBA、GL_RGB等的哪一种,否则解析结果不对;
(2)用此函数需要弄清你所用图像位深格式:32还是24
------ 已启动生成: 项目: OpenGL, 配置: Debug x64 ------
1> OpenGL.cpp
1>OpenGL.cpp(746): warning C4244: “return”: 从“WPARAM”转换到“int”,可能丢失数据
1>OpenGL.obj : error LNK2019: 无法解析的外部符号 auxDIBImageLoadA,该符号在函数 "struct _AUX_RGBImageRec * __cdecl LoadBMP(char *)" (?LoadBMP@@YAPEAU_AUX_RGBImageRec@@PEAD@Z) 中被引用
1>F:\OpenGL\x64\Debug\OpenGL.exe : fatal error LNK1120: 1 个无法解析的外部命令
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
对此研究了一下午,并没有什么重大发现;所以索性自己写了一个加载bmp的函数,考虑到上下的兼容性。在此我用到了AUX_RGBImageRec结构,其实就是一个结构体,不愿意用的话可以自己重写一下,具体如下:
typedef struct _AUX_RGBImageRec {
GLint sizeX, sizeY;
unsigned char *data;
} AUX_RGBImageRec;
自己写的bmp函数如下:
//自定义加载bmp文件
AUX_RGBImageRec * LoadBMP(char *Filename)
{
unsigned int Texture;
AUX_RGBImageRec * tex_result=new AUX_RGBImageRec; //be careful
FILE* img = NULL;
img = fopen(Filename, "r");
GLint bWidth = 0;
GLint bHeight = 0;
DWORD size = 0;
fseek(img, 18, SEEK_SET);
fread(&bWidth, 4, 1, img);
fread(&bHeight, 4, 1, img);
fseek(img, 0, SEEK_END);
size = ftell(img) - 54;
unsigned char *data = (unsigned char*)malloc(size);
fseek(img, 54, SEEK_SET); // image data
fread(data, size, 1, img);
fclose(img);
glGenTextures(1, &Texture);
glBindTexture(GL_TEXTURE_2D, Texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bWidth, bHeight, GL_BGRA, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
tex_result->sizeX = bWidth;
tex_result->sizeY = bHeight;
tex_result->data = data;
// if (data)
// free(data);
return tex_result;
}此处有几个需要注意是地方:
(1)注意像素格式,是GL_BGRA、GL_RGBA、GL_RGB等的哪一种,否则解析结果不对;
(2)用此函数需要弄清你所用图像位深格式:32还是24
相关文章推荐
- VB的32位程序在64位系统中出现文件和注册表自动转向的解决方法
- C#中实现在32位、64位系统下自动切换不同的SQLite dll文件
- wamp2.2e 64位 curl 开启不了的解决办法
- Shell脚本判断Linux系统是32位还是64位的几种方法分享
- 阿里云主机Windows 2008 32位 64位自助正版激活图文教程
- windows 2008 R2 64位服务器中开启php curl扩展的方法
- Visual Studio中根据系统区分引用64位、32位DLL动态库文件的配置方法
- win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
- linux查看cpu是否支持64位的方法
- python判断windows系统是32位还是64位的方法
- MongoDB中关于64位整型存储解决方案
- RHEL 4.7 (64bit) 环境安装 GCC 4.6 测试记录 (更新至gcc-4.6.1)
- VM 9 安装64位系统,出现的问题
- CentOS6.4 64位系统安装jdk
- 11g 64位部分安装过程
- oralce 导出32位数据导入64位时 表和字段注释乱码
- 如何看linux是32位还是64位
- 32位与64位操作系统区别
- python调用dll 出现[Error 193]
- windows8系统安装MongoDB 2.6.3配置服务启动