如何读取BMP图片,转换成二进制的数据流
BMP图片本来就是二进制的形式保存的,你就以二进制的的形式读出就可以了,即无类型文件读取,assignfile(F,'路径');reset(F,1);//每次只读一个字节num:=blockread(F,Buf,1);//读取的字节存入Buf,其他你自己处理了closefile(F);
如何用VC++读取一幅BMP格式的图像,然后在通过图像的二进制编...
BMP是一种与硬件设备无关的图像文件格式,也是我们最常在PC机上的Windows系统下见到的标准位图格式,使用范围很广泛。
它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。
它最大的好处就是能被大多数软件“接受”,可称为通用格式。
BMP在过去是比较普及的图像格式,现在BMP(Window位图)图像主要被用在PC机运行Window时的墙纸。
BMP可以提供无损压缩,压缩方式叫RLE(游程长度编码的编写),在创建墙纸图像文件时是一个极好的选项。
Window有时在查找以RLE压缩文件方式保存的墙纸图像时也会出现识别错误。
,因此使用时最好先关闭RLE压缩功能。
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
1、 BMP文件头:BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
typedef struct tagBITMAPFILEHEADER{ WORD bfType; // 位图文件的类型,必须为BM DWORD bfSize; // 位图文件的大小,以字节为单位 WORD bfReserved1; // 位图文件保留字,必须为0 WORD bfReserved2; // 位图文件保留字,必须为0 DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位 } BITMAPFILEHEADER; 2、 位图信息头:BMP位图信息头数据用于说明位图的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{ DWORD biSize; // 本结构所占用字节数 LONGbiWidth; // 位图的宽度,以像素为单位 LONGbiHeight; // 位图的高度,以像素为单位 WORD biPlanes; // 目标设备的级别,必须为1 WORD biBitCount// 每个像素所需的位数,必须是1(双色),4(16色),8(256色)或24(真彩色)之一 DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一 DWORD biSizeImage; // 位图的大小,以字节为单位 LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数 LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数 DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数 DWORD biClrImportant;// 位图显示过程中重要的颜色数 } BITMAPINFOHEADER; 3、 颜色表:颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。
typedef struct tagRGBQUAD { BYTE rgbBlue;// 蓝色的亮度(值范围为0-255) BYTE rgbGreen; // 绿色的亮度(值范围为0-255) BYTE rgbRed; // 红色的亮度(值范围为0-255) BYTE rgbReserved;// 保留,必须为0 } RGBQUAD; 颜色表中RGBQUAD结构数据的个数有biBitCount来确定: 当biBitCount=1,4,8时,分别有2,16,256个表项; 当biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下: typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; // 位图信息头 RGBQUAD bmiColors[1]; // 颜色表 } BITMAPINFO; 4、 位图数据:位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。
位图的一个像素值所占的字节数: 当biBitCount=1时,8个像素占1个字节; 当biBitCount=4时,2个像素占1个字节; 当biBitCount=8时,1个像素占1个字节; 当biBitCount=24时,1个像素占3个字节; Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充, 一个扫描行所占的字节数计算方法: DataSizePerLine= (biWidth* biBitCount+31)/8; // 一个扫描行所占的字节数 DataSizePerLine= DataSizePerLine/4*4; // 字节数必须是4的倍数 位图数据的大小(不压缩情况下): DataSize= DataSizePerLine* biHeight; 二、BMP文件分析 1、 工具软件:Hex Workshop 或 UltraEdit 2、 分析:首先请注意所有的数值在存储上都是按"高位放高位、低位放低位的原则",如12345678h放在存储器中就是7856 3412)。
下图是一张图16进制数据,以此为例进行分析。
在分析中为了简化叙述,以一个字(两个字节为单位,如424D就是一个字)为序号单位进行,"h"表示是16进制数。
424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100 1000 0300 0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000 00F8 0000 E007 0000 1F00 0000 0000 0000 02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 1:图像文件头。
424Dh='BM',表示是Windows支持的BMP格式。
2-3:整个文件大小。
4690 0000,为00009046h=36934。
4-5:保留,必须设置为0。
6-7:从文件开始到位图数据之间的偏移量。
4600 0000,为00000046h=70,上面的文件头就是35字=70字节。
8-9:位图图信息头长度。
10-11:位图宽度,以像素为单位。
8000 0000,为00000080h=128。
12-13:位图高度,以像素为单位。
9000 0000,为00000090h=144。
14:位图的位面数,该值总是1。
0100,为0001h=1。
15:每个像素的位数。
有1(单色),4(16色...
有没有编辑查看二进制文件的工具或资料
你的思路有问题。
二进制怎么解析是由具体使用它的软件决定的,二进制编辑器没有能力判断按哪种方法、什么格式解析数据。
换句话说,世界上的数据结构那么多、定义那么丰富,没有哪个编辑器能够全部涵盖。
当然许多二进制编辑器(例如UE或Winhex)都支持基本的ANSI编码,并提供了进制转换工具,这已经大大减轻了人工解析时的强度。
把一张BMP灰度图转换为二进制的工具,有没啊?
1 UltraEdit在打开文件的时候,会对文件类型进行检查。
如果是二进制文件,会自动转为16进制显示模式。
如下图:中间的16进制值就是文件的实际内容。
可以查看,也可以点击进行编辑。
2 如果没有识别为二进制文件,但是想查看16进制显示内容,即以二进制文件方式进行查看编辑,可以点击菜单编辑,选择16进制函数项,在二级菜单中选择,十六进制编辑,即可将视图转换为16进制模式。
如下图:3 要退出16进制模式,转为文本查看,再次点击该项即可。
4 快速更换模式的快捷键为ctrl+h。
如何查看二进制文件的文件内容?
二进制文件的文件内容可借助第三方软件UltraEdit来查看。
UltraEdit 是一套功能强大的文本编辑器,可以编辑文本、十六进制、ASCII 码,完全可以取代记事本(如果电脑配置足够强大),内建英文单字检查、C++ 及 VB 指令突显,可同时编辑多个文件,而且即使开启很大的文件速度也不会慢。
1)运行UltraEdit软件。
2)菜单栏-文件-打开-选取一个二进制文件。
3)打开这个文件。
4)上图显示区域左侧是地址,中间部分是每个字节的16进制双字符表示,右侧区域显示是可见的单字节ASCII字符及双字节乱码。
参考:http://baike.baidu.com/link?url=sJXqiEQdVI-HOR9cZ-BB1LhJQ0kCbwS7pIbqZzrykdFwRtniqeIjcOSA0naFTpKvLnhaK29ZWzePAKMdQSLCAq
转载请注明出处51数据库 » 查看bmp二进制软件
断魂少爷