java解析bmp文件

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

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

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

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

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

 

        文件头信息块

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

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

        

Java代码 复制代码 收藏代码
  1.  //读取前面14个字节  
  2. int bflen=14;  
  3. byte bf[]=new byte[bflen];  
  4. dis.read(bf);  
  //读取前面14个字节int bflen=14;byte bf[]=new byte[bflen];dis.read(bf);

 

       图像描述信息块

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

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

       

Java代码 复制代码 收藏代码
  1. //读取后面40个字节,并且获取到图像的宽和高  
  2. int bilen=40;  
  3. byte bi[]=new byte[bilen];  
  4. dis.read(bi,0,bilen);  
  5. image_width=ChangeInt(bi,7);  
  6. image_height=ChangeInt(bi,11);  
	//读取后面40个字节,并且获取到图像的宽和高int bilen=40;byte bi[]=new byte[bilen];dis.read(bi,0,bilen);image_width=ChangeInt(bi,7);image_height=ChangeInt(bi,11);

       

Java代码 复制代码 收藏代码
  1.       /** 
  2.  * byte转变为int数据的方法 
  3.  * @param bi传入的数组 
  4.  * @param end四个byte型数的最后的一个 
  5.  * @return 
  6.  */  
  7. public int ChangeInt(byte[] bi,int end){  
  8.     return(((int)bi[end]&0xff)<<24)  
  9.     |(((int)bi[end-1]&0xff)<<16)  
  10.     |(((int)bi[end-2]&0xff)<<8)  
  11.     |(int)bi[end-3]&0xff;  
  12. }  
       /*** 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的整数倍的数据。

        

Java代码 复制代码 收藏代码
  1. /** 
  2.  * 显示颜色的方法 
  3.  * 对颜色的处理 
  4.  * @param dis数据流 
  5.  */  
  6. public void showRGB24(DataInputStream dis){  
  7.     if(!(image_width*3%4==0)){  
  8.         skip_width=4-image_width*3%4;  
  9.     }  
  10.     //申请数组空间  
  11.     imageG=new int[image_height][image_width];  
  12.     imageB=new int[image_height][image_width];  
  13.     imageR=new int[image_height][image_width];  
  14.       
  15.     for(int h=image_height-1;h>=0;h--){  
  16.         for(int w=0;w<image_width;w++){  
  17.             try {  
  18.                 int blue= dis.read();  
  19.                 int green=dis.read();  
  20.                 int red=dis.read();  
  21.                   
  22.                 imageB[h][w]=blue;  
  23.                 imageG[h][w]=green;  
  24.                 imageR[h][w]=red;  
  25.   
  26.             } catch (IOException e) {  
  27.                 e.printStackTrace();  
  28.                 System.exit(0);  
  29.             }  
  30.               
  31.             if(w==0){  
  32.                 try {  
  33.                     System.out.println(dis.skipBytes(skip_width));  
  34.                 } catch (IOException e) {  
  35.                     e.printStackTrace();  
  36.                       
  37.                 }  
  38.             }                 
  39.         }  
  40.     }         
  41. }  
	/*** 显示颜色的方法* 对颜色的处理* @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 啦。


 

一点小结:

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

转载于:https://www.cnblogs.com/java20130722/p/3206902.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不到20行代码,用Python做一个智能聊天机器人

这是小编推荐的第 11 篇好文来源&#xff1a;菜鸟学Python作者&#xff1a;小安和小编伴随着自然语言技术和机器学习技术的发展&#xff0c;越来越多的有意思的自然语言小项目呈现在大家的眼前&#xff0c;聊天机器人就是其中最典型的应用&#xff0c;今天小编就带领大家用不到…

详解div+css相对定位和绝对定位用法

1.定位的专业解释&#xff1a; (1)语法 position:static|absolute|fixed|relative 从上面语法可以看出&#xff0c;定位的方法有很多种&#xff0c;它们分别是静态(static)&#xff0c;绝对定位(absolute)&#xff0c;固定(fixed)&#xff0c;相对定位(relative)。在这个教程里…

Python基础入门_3条件语句和迭代循环

Python 基础入门前两篇&#xff1a; Python 基础入门–简介和环境配置Python基础入门_2基础语法和变量类型 这是第三篇内容&#xff0c;主要简单介绍条件语句和迭代循环语句&#xff0c;内容也比较简单&#xff0c;目录如下&#xff1a; 条件语句和迭代循环 1. 条件语句 Py…

排序算法比较总结

冒泡排序 每次从头开始&#xff08;每次结束可以不到最后&#xff0c;因为上一次已经确定最大值在末尾了&#xff09;&#xff0c;比较相邻两个数&#xff0c;每次下沉一个最大值。 123456789101112131415161718192021222324252627282930313233343536 #include <iostream>…

如果你还不了解GBDT,不妨看看这篇文章

作者&#xff1a;Freemanzxp简介&#xff1a;中科大研二在读&#xff0c;目前在微软亚洲研究院实习&#xff0c;主要研究方向是机器学习。原文&#xff1a;https://blog.csdn.net/zpalyq110/article/details/79527653Github&#xff1a;https://github.com/Freemanzxp/GBDT_Sim…

javascript 面向对象编程小记

虽然平常用jquery用的很熟&#xff0c;但是基本都是面向过程的写法。一个事件一个function&#xff0c;很少有面向对象的写法。今天得写一个日期控件&#xff0c;不得不用上面向对象编程。 刚开始我的想法是: var datepicker function(){return new datepicker.fn.init(); }da…

来了解下计算机视觉的八大应用

2019 第 40 篇&#xff0c;总第 64 篇文章本文大约7000字&#xff0c;建议收藏阅读之前通过三篇文章简单介绍了机器学习常用的几种经典算法&#xff0c;当然也包括了目前很火的 CNNs 算法了&#xff1a;常用机器学习算法汇总比较(上&#xff09;常用机器学习算法汇总比较(中&am…

CRM系统助家具企业华丽转身

近年来&#xff0c;随着住宅建设规模的扩大&#xff0c;作为住宅主要配套商品的家具将迎来广阔的发展机遇和市场增长空间。 我国家具行业以中小企业为多&#xff0c;并且小型私营家具企业在当中占大比例&#xff0c;管理粗放&#xff0c;实行的大多是家族式、经验式管理&#x…

itchat 保存好友信息以及生成好友头像图片墙

2019 第 41 篇&#xff0c;总第 65 篇文章本文大约 4000 字&#xff0c;阅读大约需要 12 分钟最近简单运用 itchat 这个库来实现一些简单的应用&#xff0c;主要包括以下几个应用&#xff1a;统计保存好友的数量和信息统计和保存关注的公众号数量和信息简单生成好友头像的图片墙…

启动outlook时报错:mapi无法加载信息服务msncon.dll

今天这个Office2010 outlook搞的让人蛋疼&#xff0c;老是说启动outlook时报错&#xff1a;mapi无法加载信息服务msncon.dll。 百度了一下&#xff0c;如下解决方案&#xff1a; 安装路径为D:\NEW Windows7 File\office2010\Office14 在命令行中定位到outlook安装文件夹&#x…

快速入门Pytorch(1)--安装、张量以及梯度

2019 第 42 篇&#xff0c;总第 66 篇文章本文大约 9000 字&#xff0c;建议收藏阅读&#xff01;这是翻译自官方的入门教程&#xff0c;教程地址如下&#xff1a;https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html虽然教程名字是 60 分钟入门&#xff0…

快速入门PyTorch(2)--如何构建一个神经网络

2019 第 43 篇&#xff0c;总第 67 篇文章本文大约 4600 字&#xff0c;阅读大约需要 10 分钟快速入门 PyTorch 教程第二篇&#xff0c;这篇介绍如何构建一个神经网络。上一篇文章&#xff1a;快速入门Pytorch(1)--安装、张量以及梯度本文的目录&#xff1a;3. 神经网络在 PyTo…

程序员的职业素养文摘

第1章 专业主义 第2章 说“不” 第3章 说“是” 第4章 编码 第5章 测试驱动开发 第6章 练习 第7章 验收测试 第8章 测试策略 第9章 时间管理 第10章 预估 第11章 压力 第12章 协作 第13章 团队与项目 第14章 辅导&#xff0c;学徒期与技艺转载于:https://www.cnblogs.com/smile…

快速入门PyTorch(3)--训练一个图片分类器和多 GPUs 训练

2019 第 44 篇&#xff0c;总第 68 篇文章本文大约14000字&#xff0c;建议收藏阅读快速入门 PyTorch 教程前两篇文章&#xff1a;快速入门Pytorch(1)--安装、张量以及梯度快速入门PyTorch(2)--如何构建一个神经网络这是快速入门 PyTorch 的第三篇教程也是最后一篇教程&#xf…