解析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文件格式的解析与显示 vc6调试,但代码是跨平台的。
BMP文件格式解析,主要用来分析CMOS SENSOR 的RAW图的,可以看具体的RGB值。
本文主要介绍了bmp这种文件格式的类型,其中对于一般的bmp文件其前面54个主要是表头这类信息,如大小、像素等等。后面的才为数据
在visual studio上基于MFC实现BMP图片读取,在图形化界面可操作,待改进功能包括线性变换,直方图均衡化,规定化等。
BMP文件格式详细分析,对于需要做BMP解析的入门资料非常棒。。
一、BMP文件分析 1. 什么是BMP(位图)? 常见的图像文件格式有:BMP、JPG(JPE,JPEG)、GIF等。 BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。...
BMP文件格式文档(用于解析BMP文件)
步骤:(1) 读取文件信息,以二进制方式打开并读取位图文件信息复制给新的变量后关闭文件;...(5) bmp数据存储时按行从左到右、按列从下到上扫描,所以对于24位bmp文件,数据区前三个字节代表位图左下角第一个元素;
bmp文件格式解析
读取一个标准的24位真彩色BMP文件,然后转化为灰色图像,最后存储为8位BMP文件。
1:BMP由四部分组成:BMP文件头(14字节)、位图信息头(40字节)、颜色表、位图数据。 2:BMP文件头(14字节) BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。 其结构定义如下: typedef ...
支持从文件系统中读取BMP文件并解析到LCD屏上。同时可以生成对应的缩列图。
bmp文件解析,在linux下也可用
读取bmp文件并解析其结构,供进行抽取操作的基类,供大家参考,共同学习!
详细的解析了BMP图像(BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。)
BMP位图文件解析 PDF文档 内涵 解码过程说明 不是完整的源码
一个BMP文件分析工具,可以查看BMP文件的详细信息,包括块区域的RGB值。 代码非本人写,版权归原作者所有
BMP文件解析,将BMP文件显示出来 BMP文件?馕觯獴MP文件显示出来
易语言BMP文件查看源码,BMP文件查看