解析bmp图像
今天做了一个很好玩的东西————bmp图片解析器。刚看到的时候我觉得超难,完全不
懂,做出来之后,觉得其实很简单!接下来就让我来介绍一下吧!
在真正做解析器之前我们应该先了解一些基础知识!
位运算:
1.由byte型转为int型(下面是4个byte转为一个byte)
(((int)b4&0xff)<<24
|(((int)b3&0xff)<<16)
|(((int)b2&0xff)<<8)
|(((int)b1&0xff)<<0));
如果只是一个byte转一个int只需(((int)b1&0xff)<<0));即可
我在做这个的时候遇到一个问题:
在解析系统画板的画或下载的bmp图像时这样写((int)b1&0xff<<0));
不会出现问题!但是在解析自己画板保存的bmp图像时出现问题!请教大神后,给我的解
释是对上面这种写法系统是兼容的,但对自己画板的画可能不兼容!所以图像就会乱!大
家可以参考,如有问题欢迎纠正!
/**
* 将4个byte数转换成int型
* @param b1
* @param b2
* @param b3
* @param b4
* @return
*/
public int change(byte b1,byte b2,byte b3,byte b4){
return (((int)b4&0xff)<<24|(((int)b3&0xff)<<16)
|(((int)b2&0xff)<<8)|(((int)b1&0xff)<<0));
}
2.由int型转为byte型(将一个int类型的数data转换为byte型存入数组)
byte[] b=new byte[4];
b[0]=(byte) ((data>>>0)&0xff);
b[1]=(byte)((data>>>8)&0xff);
b[2]=(byte)((data>>>16)&0xff);
b[3]=(byte)((data>>>24)&0xff);
位图的一个像素值所占的字节数:
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节;
现在开始正题
bmp结构: BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
1.文件头信息
BMP文件头(14字节)BMP文件头数据结构含有
BMP文件的类型、文件大小和位图起始位置等信息。
文件类型BM——————————————————2个字节(4D42)
文件大小————————————————————4个字节
保留信息————————————————————4个字节
偏移量 ————————————————————4个字节
BmpData bd=new BmpData();
//文件头信息大小
int bheadlen=14;
//创建一个byte数组保存文件头信息
byte[] bhead=new byte[14];
//将文件信息读入数组
dis.read(bhead, 0, bheadlen);
//调用change将byte转为int
bd.size=this.change(bhead[2], bhead[3], bhead[4], bhead[5]);
bd.bfOffBits=this.change(bhead[10], bhead[11], bhead[12], bhead[13]);
2.位图信息(我做的是24真彩色)
位图信息头(40字节) BMP位图信息头数据用于说明位图的尺寸等信息。
本结构所占用字节数—————————————4个字节
位图的宽 ————————————————————4个字节 (宽和高的顺序不能错)
位图的高 ————————————————————4个字节
目标设备的级别————————————————2个字节
每个像素所需的位数,必须是1(双色), 4(16色),8(256色)或24(真彩色)之一
————————————2个字节
位图压缩类型,必须是0(不压缩)————2个字节
位图的大小 ——————————————————4个字节
位图水平分辨率,每米像素数 ——————4个字节
位图垂直分辨率,每米像素数 ——————4个字节
位图实际使用的颜色表中的颜色数 ——4个字节
位图显示过程中重要的颜色数 ——————4个字节
//位图信息头大小(只取了部分需要的数据)
int bmesslen = 40;
byte[] bmess=new byte[bmesslen];
dis.read(bmess, 0, bmesslen);
bd.biWidth=this.change(bmess[4], bmess[5], bmess[6], bmess[7]);
bd.biHigh=this.change(bmess[8], bmess[9], bmess[10], bmess[11]);
width=bd.biWidth;
high=bd.biHigh;
3.颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的
结构,定义一种颜色。
蓝色的亮度(值范围为0-255)
绿色的亮度(值范围为0-255)
红色的亮度(值范围为0-255)
4.位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间
是从下到上。
//位图数据大小
int datalen;
//判断宽度是不是4的整数倍
if(width*3%4==0){
datalen=width*3;
}else{
//宽度不是4的整数倍是跳过系统补0后的宽度
datalen=4-width*3%4+width*3;
}
//将数据存入data二维数组中
byte data[][]=new byte[high][datalen];
for(int i=0;i<high;i++){
dis.read(data[i], 0, datalen);
}
//将byte类型的data数组转换为int类型
int data1[][]=new int[high][datalen];
for(int i=0;i<high;i++){
for(int j=0;j<datalen;j++){
//两种方法
//data1[i][j]=(data[i][j]+256)%256;
data1[i][j]=((int)data[i][j]&0xff);
}
如此即可吧一个bmp图像信息读取出来
然后在画板上画出即可
/**
* 显示图片,即按照给定的数据画点(从下到上,从左到右)
* @param data:给定的图像的数据
*/
public void draw( int[][] data){
int x=300,y=550;
for(int j=0;j<data.length;j++){
for(int i=2;i<width*3;i+=3){
//读取图像的颜色信息
int blue=data[j][i-2];
int green=data[j][i-1];
int red=data[j][i];
g.setColor(new Color(red,green,blue));
g.drawLine(x, y, x, y);
x++;
}
x=200;
y--;
System.out.println(x+","+y);
}
}
现在觉得不难了吧!
分享到:
相关推荐
BMP文件解析器是一款用于理解和处理BMP(Bitmap)图像文件的工具,主要针对BMP文件格式进行解析,并能展示图像内容。BMP是Windows操作系统中最常见的位图图像格式,它以未经压缩的原始数据存储图像,因此理解其内部...
BMP文件解析(DOC格式)主要涉及的是Windows操作系统中的图像文件格式,尤其是设备无关位图(DIB)的结构和解析方法。BMP文件是Windows环境下广泛应用的位图格式,所有图象处理软件都支持。本文将详细介绍BMP文件的...
### BMP文件解析 #### 一、BMP文件概述 BMP(Bitmap)是一种常见的位图图像格式,由Microsoft设计用于Windows系统。BMP文件的主要特点是无损压缩且包含丰富的颜色信息,非常适合保存原始图像数据。BMP文件由两大...
BMP文件格式解析,主要用来分析CMOS SENSOR 的RAW图的,可以看具体的RGB值。
通过阅读提供的博客文章(),你可以找到更详细的解释和完整的源代码,这将帮助你更好地理解BMP文件解析的过程,并可能包含处理不同情况的额外功能。此外,还可以参考Java的`java.awt.image`包中的其他类,例如`...
首先,我们需要了解BMP文件格式。BMP是一种常见的位图图像文件格式,不包含任何压缩,存储了图像的像素数据、宽度、高度、颜色深度等信息。在MFC中,我们可以使用CBitmap类来处理BMP文件。 步骤1:创建MFC应用程序 ...
首先,我们需要了解BMP文件的基本结构。BMP文件头包含了图像的重要信息,如宽度、高度、颜色深度等。它由两部分组成:DIB(Device Independent Bitmap)头和BITMAPINFOHEADER结构体。DIB头通常是14字节,用于标识...
#### 六、BMP文件解析示例 为了更好地理解BMP文件如何被解析,可以考虑编写简单的程序来读取和解析BMP文件的各个部分。通过逐个读取文件头和信息头的数据,并根据这些信息来解码像素数据,即可还原原始图像。 总之...
总的来说,BMP文件解析涉及到文件格式的理解、内存管理以及颜色空间转换。通过正确地读取和处理文件,可以将位图数据转换为便于处理的RGB格式,从而进行图像处理、分析或显示。在实际编程中,需要考虑各种细节,如...
BMP文件格式详细分析,对于需要做BMP解析的入门资料非常棒。。
一、BMP文件分析 1. 什么是BMP(位图)? 常见的图像文件格式有:BMP、JPG(JPE,JPEG)、GIF等。 BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。...
总结一下,BMP文件解析涉及对文件结构的理解,包括文件头、信息头和像素数据的解读。掌握这些知识可以帮助开发者编写读取和处理BMP文件的代码,从而在图像处理项目中实现对BMP图像的有效操作。同时,了解BMP格式也有...
二、BMP文件解析 解析BMP文件主要就是读取文件头和信息头,并根据这些信息解码像素数据。由于BMP文件是未压缩的,像素数据通常按行存储,从底部行(图像的最顶部)开始,逐行向上。对于24位BMP(真彩色),每个像素...
解析BMP文件时,需要按照上述结构读取和处理数据,以恢复原始图像。在编程中,可以使用各种语言(如C++、C#、Python等)实现BMP文件的读取和写入功能。需要注意的是,由于BMP文件没有压缩,处理大尺寸图像时可能会...
本项目" BMP图片解析C程序 "是一个C语言编写的程序,专门设计来读取BMP文件,并将其内容显示在LCD(Liquid Crystal Display)屏幕上。此外,该程序还具有生成缩略图的功能,这对于资源有限的设备或者需要高效处理...
### BMP文件格式解析 BMP(Bitmap)文件格式是一种设备无关位图(DIB, Device-Independent Bitmap)格式,主要用于Windows系统中存储图像文件。它因能够无损地保存图像像素数据而广受青睐,成为了获取原始(RAW)...
步骤:(1) 读取文件信息,以二进制方式打开并读取位图文件信息复制给新的变量后关闭文件;...(5) bmp数据存储时按行从左到右、按列从下到上扫描,所以对于24位bmp文件,数据区前三个字节代表位图左下角第一个元素;
总之,理解和解析BMP文件结构是图像处理领域的一个基础技能。通过学习和掌握,我们可以更好地进行图像读取、修改和保存,进一步应用于图像分析、图像合成等高级任务。对于开发者来说,熟悉BMP文件结构能够增强处理...
当我们将BMP文件转换为TXT时,我们需要解析这些二进制数据并将其转化为人类可读的文本格式。这通常包括: 1. 文件头:BMP文件以一个固定长度的文件头开始,包括文件大小、创建时间等信息。例如,DOS头(2字节)和...
- **解析块区域**:工具能将BMP文件划分为多个块,并显示每个块的RGB值分布,这在分析图像的色彩分布或寻找隐藏信息时很有用。 - **颜色分析**:用户可以对特定区域的颜色进行统计分析,例如计算平均色、最常见颜色...