最近想做一个图片查看器,因为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. for(int h=image_height-1;h>=0;h--){
  15. for(int w=0;w<image_width;w++){
  16. try {
  17. int blue= dis.read();
  18. int green=dis.read();
  19. int red=dis.read();
  20. imageB[h][w]=blue;
  21. imageG[h][w]=green;
  22. imageR[h][w]=red;
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. System.exit(0);
  26. }
  27. if(w==0){
  28. try {
  29. System.out.println(dis.skipBytes(skip_width));
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }
  35. }
  36. }
   /*** 显示颜色的方法* 对颜色的处理* @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

java解析bmp文件相关推荐

  1. java 解析 csv 文件

    文章分类:JavaEye 一.貌似有bug,不行用 二.或 三. 的方法 Java代码   import java.io.BufferedReader; import java.io.FileInpu ...

  2. 用正则表达式和java解析csv文件

    用正则表达式和java解析csv文件 作者:弹着钢琴设计  来源:博客园  发布时间:2009-06-15 18:31  阅读:337 次  原文链接   [收藏]   在解析csv文件之前,先来看看 ...

  3. java解析dxf文件_浅析JVM方法解析、创建和链接

    一:前言 上周末写了一篇文章<你知道Java类是如何被加载的吗?>,分析了HotSpot是如何加载Java类的,干脆趁热打铁,本周末再来分析下Hotspot又是如何解析.创建和链接类方法的 ...

  4. java解析xml文件

    使用java解析xml文件,通过dom4j. 代码如下: package com.java.team; import java.io.File; import java.util.ArrayList; ...

  5. java解析Excel文件

    下文介绍java解析Excel文件的方案 前置准备 1.第三方jar包或者Maven配置 org.apache.poi的jar包 Maven配置如下 <groupId>org.apache ...

  6. XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 查找校验xml文件中相同的节点属性值 java遍历文件夹解析XML

    XML解析 (JAVA解析xml文件)java+Dom4j+Xpath xml文件解析根据子节点得到父节点 以及查找xml文件中相同的节点属性值 项目背景:这是本人实习中所碰到的项目,当时感觉很棘手, ...

  7. JAVA解析.xlsb文件

    Java解析.Xlsb文件 pom.xml <dependency><groupId>org.apache.poi</groupId><artifactId& ...

  8. java解析xml文件的几种方式(DOM解析)

    好久不用的东西,今天居然被面试官问到了.那既然这样,我们就一起回顾下java解析xml文件的几种方式吧. DOM解析 dom解析所需依赖是我们jdk自带的,所以只需要使用jdk为我们提供的接口即可上手 ...

  9. Java解析yaml文件

    Java解析yaml文件 1. 什么是yaml ? 2. 导入maven依赖 3. yaml 案例文件 4. 示例代码 5. 解析结果 1. 什么是yaml ? 参考下方链接 yaml快速入门 2. ...

最新文章

  1. java学习笔记11--Annotation
  2. idea 高效找出全部未被使用的代码
  3. ViewPager相互嵌套,导致子ViewPager无法滑动,且子ViewPager中的view无法被点击
  4. 结构体中的malloc 与 free
  5. vs2010 出错:error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  6. POJ 1422 Air Raid
  7. php实现数字滚动效果,vue如何实现数字滚动增加效果?代码示例
  8. 为什么同样是读书,有人能让自己的收益提高50倍,而你只能成为文艺的中年大叔?
  9. 5G精华问答 | 除了速度,5G还能带来什么?
  10. Smart3D输出/输入空三结果
  11. 计算机网络和电气之间的联系,2020年电气工程师《基础知识》历年真题精选0830...
  12. Codeforces 1194D
  13. 第七章:Java基础数据类型-整数类型
  14. win10彻底关闭自动更新
  15. 【经验】AngularJS
  16. Python打印表格
  17. mysql查询带序列号
  18. 用keil如何编写c类型语言,keil怎么写程序
  19. 阿里云服务器购买流程
  20. Ubuntu下如何查看GPU版本和使用信息?

热门文章

  1. 三种地理参考信息模型:WMS,WFS,WCS(转)
  2. github windows客户端
  3. Java学习进阶—高级编程
  4. linux中的守护进程
  5. golang实现常用数据结构
  6. python模块学习(1)
  7. 客户端获取游客IP,获取客户地理信息,展示地图
  8. leetcode 1239. 串联字符串的最大长度
  9. leetcode LCP 19. 秋叶收藏集(dp)
  10. css左右布局代码_如何使用CSS位置来布局网站(带有示例代码)