首页 > 代码库 > 简易bmp图片读取
简易bmp图片读取
BMP全称bitmap(位图),是windows中的标准图像文件格式,可以读入一张bmp图像作为纹理.
以下是我目前正在使用的位图加载类.首先是头文件:
#define swapcolor(a,b){ (a) ^= (b); (b) ^= (a); (a) ^= (b); } class BmpLoader { private: unsigned char* header;//文件头 unsigned int dataPos;//读取位置 unsigned int width, height;//图片宽度 高度 unsigned int imageSize;//图片内容大小 public: unsigned char * data;//图片内容 rgb BmpLoader(); ~BmpLoader(); void bFree(); int getWidth(); int getHeight(); bool loadBitmap(const char* fileName); };
swapcolor用于交换颜色值,由于bmp存储的颜色顺序是bgr,要把它变成rgb
接着是具体的实现:
BmpLoader::BmpLoader() { header=new unsigned char[54]; } BmpLoader::~BmpLoader() { bFree(); delete[] data; } void BmpLoader::bFree() { delete[] header; }
构造函数与析构函数,文件头大小为54字节
接着是读取图片的主要方法,fileName是图片名字(带路径)
bool BmpLoader::loadBitmap(const char* fileName) { FILE * file = fopen(fileName,"rb"); if (!file) { printf("Image could not be opened"); return false; } if (fread(header, 1, 54, file)!=54) {//文件头并非54字节 读取失败 printf("Not a correct BMP file"); return false; } if (header[0]!='B' || header[1]!='M') {//文件头开头并非BM 读取失败 printf("Not a correct BMP file"); return false; } dataPos = *(int*)&(header[0x0A]);//读取位置 位置在文件头0x0A处 imageSize = *(int*)&(header[0x22]);//图片内容大小数据 位置在文件头0x22处 width = *(int*)&(header[0x12]);//图片宽度数据 位置在文件头0x12处 height = *(int*)&(header[0x16]);//图片高度数据 位置在文件头0x16处 if (imageSize==0) imageSize=width*height*3;//图片内容数据=总像素数x3(简单起见使用宽高为2的n次方大小的图片,不考虑4字节对齐) if (dataPos==0) dataPos=54;//文件头读完 位置在54字节处 data = http://www.mamicode.com/new unsigned char [imageSize];//data放像素信息>
获取图片宽度与高度:int BmpLoader::getWidth() { return width; } int BmpLoader::getHeight() { return height; }
调用loadBitmap加载图片数据,data就是图片的像素数据.
注意这个类只能用于读取24位bmp位图,图的宽度与高度是2的n次方.参考: http://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/
简易bmp图片读取
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。