读入bmp格式图像文件
来源:互联网 发布:mysql 创建覆盖索引 编辑:程序博客网 时间:2024/05/18 22:08
计算机的图片有多种格式,比如jpg,png,gif,bmp等。
其中bmp是无压缩的位图图像文件。
下图是一张100*100像素的小狗位图图像。
在计算机中,这张小狗图像以如下的二进制形式存放。
位图文件所对应的二进制文件信息包含三部分:文件头+信息头+数据区
文件头:
typedef struct tagBITMAPFILEHEADER {WORD bfType;DWORD bfSize;WORD bfReserved1;WORD bfReserved2;DWORD bfOffBits;} BITMAPFILEHEADER;
信息头:
typedef struct tagBITMAPINFOHEADER{DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;} BITMAPINFOHEADER;
数据区:
数据区保存着点阵图像(位图)各点的颜色信息。
一般是三个字节保存一个像素点的信息。三个字节分别为某点颜色信息的和红绿蓝(RGB)分量,因为不同比例的红绿蓝可以杂凑出所有颜色。
写一个类DMPC,用来解析dmp位图图像:
DMPC.h
#pragma once //位图文件头typedef struct tagBITMAPFILEHEADER {WORD bfType;DWORD bfSize;WORD bfReserved1;WORD bfReserved2;DWORD bfOffBits;} BITMAPFILEHEADER; //位图信息头typedef struct tagBITMAPINFOHEADER{DWORD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;} BITMAPINFOHEADER; //dmp class,位图解析类class DMPC{public:BITMAPFILEHEADER file_head;BITMAPINFOHEADER info_head;unsigned char *pBmpBuf;//读入图像数据的指针float *pBmpBuff;//读入图像数据的指针int bmpWidth;//图像的宽int bmpHeight;//图像的高RGBQUAD *pColorTable;//颜色表指针int biBitCount;//图像类型,每像素位数DMPC(void);~DMPC(void);int read_pic(CString m_path);//传入位图文件地址,并解析图像};
DMPC.cpp文件,visual studio的类,添加了StdAfx.h的头文件
#include "StdAfx.h"#include "DMPC.h"DMPC::DMPC(void){}DMPC::~DMPC(void){}int DMPC::read_pic(CString m_path){FILE *fp = fopen(m_path,"rb");if (fp == NULL)return -1;//跳过文件头fseek(fp, sizeof(BITMAPFILEHEADER),0);//读入信息头BITMAPINFOHEADER head;fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);//解析信息头得到一些关键信息bmpWidth = head.biWidth; bmpHeight = head.biHeight; biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数) int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256 if(biBitCount==8){ //申请颜色表所需要的空间,读颜色表进内存 pColorTable=new RGBQUAD[256]; fread(pColorTable,sizeof(RGBQUAD),256,fp);} //申请位图数据所需要的空间,读位图数据进内存 pBmpBuf = new unsigned char[lineByte * bmpHeight]; pBmpBuff = new float[lineByte * bmpHeight];fread(pBmpBuf,1,lineByte * bmpHeight,fp);//解析点阵图像数据 int h = bmpHeight;int w = bmpWidth;for (int i = 0; i< h; i++){for (int j = 0; j< w; j++){int b = pBmpBuf[i*3*w + j*3];int g = pBmpBuf[i*3*w + j*3 + 1];int r = pBmpBuf[i*3*w + j*3 + 2];pBmpBuff[i*3*w + j*3] = b/255.0;pBmpBuff[i*3*w + j*3 +1] = g/255.0;pBmpBuff[i*3*w + j*3 +2] = r/255.0;//dcMem.SetPixel(j,h-i,RGB(r,g,b)); }}fclose(fp);//关闭文件 return 1;//读取文件成功}这里有个auto-encode的VC工程文件,里面有对这个类的简单使用:
0 0
- 读入bmp格式图像文件
- BMP图像文件格式
- bmp图像文件格式
- 01 BMP图像文件格式
- BMP图像文件格式
- bmp图像文件格式说明
- BMP图像文件格式
- BMP图像文件格式
- BMP格式图像文件详析
- BMP格式图像文件详析
- BMP格式图像文件详析
- BMP格式图像文件详析
- 压缩图像文件并转换成BMP格式
- BMP图像文件格式分析附带图解
- BMP(图像文件格式(Bitmap))
- bmp图像文件
- 图像文件读入和显示
- 图像文件读入和显示
- activemq設置
- Viewpager轮播
- DIV+CSS用法
- uva 1629——Cake slicing
- Android 上拉加载 PullToRefresh
- 读入bmp格式图像文件
- Linux进程间通信——使用信号量
- Unicode字符列表(超完整)
- Tomcat server.xml配置示例
- 数据结构-Java实现-简单回文
- 支持向量机(2)
- 素数筛【模板】
- js函数 Number()、parseInt()、parseFloat()的区别:
- viewDidAppear什么时候调用?