简易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 = 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/

时间: 2024-10-01 12:56:55

简易bmp图片读取的相关文章

mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换等

mp3 音频 音乐 tag ID3 ID3V1 ID3V2 标签 读取信息 获得图片 jpeg bmp 图片转换(上) MP3文件格式(二)---ID3v2 图:ID3V1标签结构 图:ID3V2标签结构 图:ID3V2头结构 图:ID3V2帧头结构 1.帧标识  用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:  TIT2=标题 表示内容为这首歌的标题,下同  TPE1=作者  TALB=专集  TRCK=音轨 格式:N/M  其中N为专集中的第N首,M为专集中共M首,N和M为AS

Linux framebuffer显示bmp图片

framebuffer简介     帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作.framebuffer是LCD对应的一中HAL(硬件抽象层),提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的.这些都是由Framebuffer设备驱动来完成的.     帧缓冲设备对应的设备文件为/dev/fb*,如果系统有多个显示卡,Linux下还可支持多个帧缓冲设备,最多可达32个,分别为/d

OpenCV:基于MFC的视频播放器和图片读取器

实例工程包下载[OpenCV:基于MFC的视频播放器和图片读取器] 一.实现的功能 1.打开本地视频进行读取.播放.暂停.停止控制 2.图片打开功能分为两种:可使用"打开图片"按钮打开本地图片,或者点击comobox里面设定的图片列表选择并显示图片 二.编译环境 OS:Win8.1 x64 IDE:  Visual Studio 2013 OpenCV: 2.4.8 三.主要思路 1.视频的滑动条控制: ①主窗体的OnHScroll()响应函数负责响应slider滑动条的变化,这样就轻

opengl打开本地bmp图片绘制

注意bmp图片的格式问题,32位ARGB  或者24位RGB.你所采用的素材一定要注意是多少位的就用多少位的.否则会显示错误的图片或者其他什么的错误. 代码如下 32位版本 #include <GL/glut.h> static GLint ImageWidth; static GLint ImageHeight; static GLint PixelLength; static GLubyte* PixelData; #include <stdio.h> #include <

日式冒险游戏《巫女小镜大冒险》PIC 图片转 BMP 图片

----------------------------------------------------------------------------- !!警告!! 游戏资源所有权,归游戏开发商所有 以下转换算法与代码,仅供学习交流使用,请勿用于非法或商业用途 由此引起的一切后果,与博主(我)无关 ----------------------------------------------------------------------------- 这游戏的资源本身没有被打包,直接就可以看

【C】用C语言提取bmp图片像素,并进行K-means聚类分析——容易遇到的问题

关于bmp图片的格式,网上有很多文章,具体可以参考百度百科,也有例子程序.这里只提要注意的问题. (1)结构体定义问题:首先按照百度百科介绍的定义了结构体,但是编译发现重定义BITMAPFILEHEADER等.其实只要包含了Windows.h,里面的wingdi.h就已经定义了处理bmp的结构体,故不需要自己再重复定义. (2)读取文件的字节对其问题:要使用#pragma pack (1)来方便读取文件头的结构体,否则结构体的大小会由于字节对齐问题改变.不知是否头文件中已经使用了该宏,在我的代码

Java 图片读取与存储

1 @Override 2 public Image myWrite(Image image, String filePath) throws IOException { 3 if (image == null) { 4 throw new IOException("Image is null!"); 5 } 6 7 // create a file 8 File imgFile = new File(filePath + ".bmp"); 9 BufferedIm

OPENGL 显示BMP图片+旋转

VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取,再用它来生成纹理,首先用auxDIBImageLoad函数将图片数据读到AUX_RGBImageRec结构体当中. 然后 //生成纹理数据 glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->siz

Linux framebuffer显示bmp图片【转】

本文转载自:http://blog.csdn.net/luxiaoxun/article/details/7622988 framebuffer简介 帧缓冲(framebuffer)是Linux为显示设备提供的一个接口,把显存抽象后的一种设备,他允许上层应用程序在图形模式下直接对显示缓冲区进行读写操作.framebuffer是LCD对应的一中HAL(硬件抽象层),提供抽象的,统一的接口操作,用户不必关心硬件层是怎么实施的.这些都是由Framebuffer设备驱动来完成的.     帧缓冲设备对应