码迷,mamicode.com
首页 > 其他好文 > 详细

简易bmp图片读取

时间:2014-11-29 13:16:35      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:opengl   图形   游戏   

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 = new unsigned char [imageSize];//data放像素信息
        fread(data,1,imageSize,file);//读取像素
        fclose(file);

        for(int i= 0;i<(int)imageSize;i+=3)
                swapcolor(data[i],data[i+2]);//bgr变为rgb
        
        return true;
}

获取图片宽度与高度:

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/

bubuko.com,布布扣

简易bmp图片读取

标签:opengl   图形   游戏   

原文地址:http://blog.csdn.net/zxx43/article/details/41594871

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!