读入bmp格式图像文件
2015-12-13 19:22
218 查看
计算机的图片有多种格式,比如jpg,png,gif,bmp等。
其中bmp是无压缩的位图图像文件。
下图是一张100*100像素的小狗位图图像。
在计算机中,这张小狗图像以如下的二进制形式存放。
位图文件所对应的二进制文件信息包含三部分:文件头+信息头+数据区
文件头:
信息头:
数据区:
数据区保存着点阵图像(位图)各点的颜色信息。
一般是三个字节保存一个像素点的信息。三个字节分别为某点颜色信息的和红绿蓝(RGB)分量,因为不同比例的红绿蓝可以杂凑出所有颜色。
写一个类DMPC,用来解析dmp位图图像:
DMPC.h
DMPC.cpp文件,visual studio的类,添加了StdAfx.h的头文件
其中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工程文件,里面有对这个类的简单使用:
相关文章推荐
- uva 1631——Locker
- 第三个Sprint ------第七天
- STM32启动方式
- Android 高仿微信(QQ)滑动弹出编辑、删除菜单效果,增加下拉刷新功能
- Android 高仿微信(QQ)滑动弹出编辑、删除菜单效果,增加下拉刷新功能
- 数据结构中表达式求值问题
- Double Cola
- 参加南京未来网络SDN大会的整理
- 引擎设计跟踪(九.14.2j) TableView工具填坑以及多国语言
- 杭电 3665 Seaside(最短路)(弗洛伊德过)
- JavaWeb自学之html学习笔记 Day-1
- 5.2 calendar--通用日期的相关函数(3)
- 黑马程序员--Java编程之API阶段总结
- 5.2 calendar--通用日期的相关函数(3)
- [DIP]客观保真度准则与主观保真度准则
- jquery特效(8)—倒计时
- 设计模式之观察者模式简单理解
- C语言知识整理(2):volatile与register
- unity打包及优化转载
- Eclipse的快捷键