`
lwangkangrui
  • 浏览: 15789 次
  • 性别: Icon_minigender_2
最近访客 更多访客>>
社区版块
存档分类
最新评论

java解析bmp文件

 
阅读更多

         最近想做一个图片查看器,因为bmp的图片简单些,也就从这个入手。

         运用的基本知识还是IO的,关键是在于对于“协议”的理解。

         一直觉得这些个协议是个很帅气的东西。感觉就像密码一样,你读到了一个文件,你只有知道对方的“加密”方式,你才能正确的解读,否则你拿着也没用。就像你无法用记事本正确地打开一张图片一样,里面只会全是乱码。

        言归正传,根据以上的说法,我们首先应该去了解的是BMP文件时如何写的。

        BMP文件分为四个部分:文件头信息块,图像描述信息块,颜色表,图像信息区。

 

        文件头信息块

        这个部分主要是一些基本的信息,比如,开头两个字节最终读出来是BM,是标识BMP文件的,所以如果以后想要读多种文件分类,可以用开头的标识来分类。

        因为此部分的信息后面读取图片意义不大,所以直接读出来,跳过。

        

  //读取前面14个字节
	int bflen=14;
	byte bf[]=new byte[bflen];
	dis.read(bf);

 

       图像描述信息块

       此部分包含图像的一些基本信息,包括图像大小,宽,高,压缩方式等等。

       宽高是一个非常重要的数据,因此在此我们要获取到宽和高。

       

	//读取后面40个字节,并且获取到图像的宽和高
	int bilen=40;
	byte bi[]=new byte[bilen];
	dis.read(bi,0,bilen);
	image_width=ChangeInt(bi,7);
	image_height=ChangeInt(bi,11);

       

       /**
	 * byte转变为int数据的方法
	 * @param bi传入的数组
	 * @param end四个byte型数的最后的一个
	 * @return
	 */
	public int ChangeInt(byte[] bi,int end){
		return(((int)bi[end]&0xff)<<24)
		|(((int)bi[end-1]&0xff)<<16)
		|(((int)bi[end-2]&0xff)<<8)
		|(int)bi[end-3]&0xff;
	}
	

         颜色表

         此区域大小由颜色模式而定,在后面读取中基本不怎么用到,所以在此就不详解了。

        图像数据区

        BMP格式的图像分为2色图,16色图,256色图以及真彩图。

        除了真彩色以外,其它三种形式均要用00补齐行字节数,使之成为4的整数倍。

        也因此,我们在处理图像的时候,要注意这个问题,跳过是用来补齐4的整数倍的数据。

        

	/**
	 * 显示颜色的方法
	 * 对颜色的处理
	 * @param dis数据流
	 */
	public void showRGB24(DataInputStream dis){
		if(!(image_width*3%4==0)){
			skip_width=4-image_width*3%4;
		}
		//申请数组空间
		imageG=new int[image_height][image_width];
		imageB=new int[image_height][image_width];
		imageR=new int[image_height][image_width];
		
		for(int h=image_height-1;h>=0;h--){
			for(int w=0;w<image_width;w++){
				try {
					int blue= dis.read();
					int green=dis.read();
					int red=dis.read();
					
					imageB[h][w]=blue;
					imageG[h][w]=green;
					imageR[h][w]=red;

				} catch (IOException e) {
					e.printStackTrace();
					System.exit(0);
				}
				
				if(w==0){
					try {
						System.out.println(dis.skipBytes(skip_width));
					} catch (IOException e) {
						e.printStackTrace();
						
					}
				}				
			}
		}		
	}

       存储好颜色之后,后面再重绘出图片就OK 啦。


 

一点小结:

包括后面要做的通信项目,个人觉得关键仍然是协议。不是一种看看就可以的状态,要深入去了解,包括一些特殊的情况。透过现象看本质吧~
 

  • 大小: 32.3 KB
4
2
分享到:
评论
5 楼 lwangkangrui 2013-07-20  
nicegege 写道
求完整的代码例子,如果不方便,则没关系。从此篇文章中掌握了大概的原理,还是感谢楼主。

不好意思啊,最近因为某个原因与世隔绝了8天。你现在还需要那个代码吗?我可以发给你
4 楼 nicegege 2013-07-10  
求完整的代码例子,如果不方便,则没关系。从此篇文章中掌握了大概的原理,还是感谢楼主。
3 楼 lwangkangrui 2013-07-04  
xc_wangwang 写道
支持一下楼主。

其实BMP文件的编码方式还是比较标准的位图数据,没有经过压缩的。
建议楼主有兴趣可以去研究下JPEG格式,这里面压缩的算法很赞。

恩恩,因为初次接触,就是先从bmp入手的。谢谢建议~
2 楼 xc_wangwang 2013-07-04  
支持一下楼主。

其实BMP文件的编码方式还是比较标准的位图数据,没有经过压缩的。
建议楼主有兴趣可以去研究下JPEG格式,这里面压缩的算法很赞。
1 楼 至尊宝_唯一 2013-07-01  
协议是很帅

相关推荐

    java关于BMP位图文件解析的分析与实现[源码][附图]

    源码 博文链接:https://smallsmile.iteye.com/blog/777572

    用java读取bmp格式图片文件

    通过读取bmp格式文件的数据格式,用数组合理的读取后,重新画出该图片

    BMP文件处理

    BMP文件的解析和显示,代码比较多,初学者不要轻易下载,不好理解

    JAVA_API1.6文档(中文)

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    Java 1.6 API 中文 New

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    java api最新7.0

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    JavaAPI1.6中文chm文档 part1

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    java jdk-api-1.6 中文 chmd

    java.security.cert 提供用于解析和管理证书、证书撤消列表 (CRL) 和证书路径的类和接口。 java.security.interfaces 提供的接口用于生成 RSA Laboratory Technical Note PKCS#1 中定义的 RSA(Rivest、Shamir 和 ...

    JavaAPI中文chm文档 part2

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    [Java参考文档]

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    StarUML是一款非常好的UML建模工具 汉化版 自带JAVA,C++插件

    StarUML 支持多种格式的影像文件,可导出JPG、JPEG、BMP、EMF和WMF等格式的影像文件。 StarUML 可以依据类图的内容生成Java、C++、C#代码,也能够读取Java、C++、C#代码反向生成类图。反向工程有两个主要用途,其一...

    [Java参考文档].JDK_API 1.6

    java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java.util.logging 提供 JavaTM 2 平台核心日志工具的类和接口。 java.util.prefs 此包允许应用程序...

    android实现gif的TextView

    具体功能: 实现了一个可以同时显示gif和bmp的TextView 不足:由于不同gif显示的频率不一样,所以可能在显示多个不同gif时, 有些gif看起来要比原来慢一些 ...GifOpenHelper.java 这是用来运态解析gif的,外界一般用不到,

    dat文件转换器.apk

    dat文件转img小工具,主要用于将微信缓存的图片dat转为对应的格式。 支持dat转jpg,png,gif,tif,bmp, 以及dat转dwg,html,htm,css,js,rtf,psd,eml,doc,vsd,mdb,ps,pdf,rmvb,flv,mp4,mp3,mpg,wmv,wav,aiv,mid,zip,rar...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    FCK在线编辑器源码及部署项目引用示例

    4.将以下代码添加到web.xml配置文件中: &lt;servlet-name&gt;Connector com.FCKeditor.connector.ConnectorServlet &lt;param-name&gt;baseDir &lt;param-value&gt;/upload/ &lt;param-name&gt;debug &lt;param-value&gt;true ...

Global site tag (gtag.js) - Google Analytics