`
lwangkangrui
  • 浏览: 16363 次
  • 性别: 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位图文件解析的分析与实现[源码][附图]

    它以未经压缩的二进制形式存储图像数据,因此解析BMP文件可以帮助我们理解和操作图像像素。 首先,了解BMP文件结构是解析的基础。BMP文件由两部分组成:位图文件头(Bitmap File Header)和位图信息头(Bitmap ...

    用java读取bmp格式图片文件

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

    java语言读取bmp文件

    然而,这些类并不直接支持BMP格式,因此需要先解析BMP文件,然后将像素数据转换为AWT能够识别的格式。 以下是一个简单的示例,展示了如何使用AWT库中的类来读取并显示BMP文件: ```java public class BMPLoader { ...

    bmp文件读出为txt文件, txt文件写入为bmp文件

    当我们将BMP文件转换为TXT时,我们需要解析这些二进制数据并将其转化为人类可读的文本格式。这通常包括: 1. 文件头:BMP文件以一个固定长度的文件头开始,包括文件大小、创建时间等信息。例如,DOS头(2字节)和...

    java实现上传文件类型检测过程解析

    "Java 实现上传文件类型检测过程解析" Java 实现上传文件类型检测过程解析是指在进行文件上传时,对上传文件的格式进行控制,以防止黑客将病毒脚本上传。单纯的将文件名的类型进行截取的方式非常容易遭到破解,...

    Bmp.rar_JAVA生成bmp

    总之,Java生成BMP图像涉及到对BMP文件格式的深入理解、数据的转换和文件的写入操作。通过精心设计的类和方法,我们可以构建出一个灵活且高效的工具,用于将DE2板生成的GRGB数据转化为标准的BMP图像文件。

    Java读取所有色bmp图片格式

    本篇文章将深入讲解如何使用Java来读取不同颜色深度的BMP图像,包括1位、4位、8位和24位的BMP文件,并介绍一个名为`BmpUtil`的工具类。 首先,我们需要理解BMP文件的基本结构。BMP文件由文件头、信息头和像素数据三...

    bmp文件格式分析及其编程

    编程处理BMP文件时,首先需要读取并解析头信息,然后按照特定的格式解码像素数据。像素数据通常是按行存储的,从底部到顶部,每行的像素数据可能需要填充以保持字节对齐。对于不同色彩深度的BMP,解码方法也不同。...

    JAVA BMP解码 超详细解释

    本文将深入探讨JAVA如何对BMP文件进行解码,包括文件头、信息头、调色板和像素数据等关键部分。 1. **文件头(File Header)** BMP文件头是文件的第一个部分,通常包含14个字节,用于标识文件类型和图像数据的位置...

    DCM文件转为bmp文件

    4. **BMP文件格式**:BMP文件通常包括位图信息头、位图信息体和像素数据。转换时,需要根据DCM文件的信息创建对应的BMP头,并将解码后的像素数据写入BMP文件。 5. **编码与压缩**:BMP文件允许无损压缩,但不强制。...

    BMP文件采样读取缩略图.rar

    在编程实现时,可以使用各种编程语言,如C++、Python、Java等,都有现成的库支持BMP文件的读写,如C++的OpenCV库,Python的PIL库等。这些库通常已经封装好了文件解析和图像处理的复杂操作,开发者只需调用相应的API...

    打开BMP文件带预览功能.zip_打开BMP_文件打开_预览

    这些库提供了读取、解析BMP文件的方法,能方便地获取图像信息并显示。 预览功能的实现主要涉及图像的渲染。在Windows操作系统中,可以利用GDI+(Graphics Device Interface Plus)来快速实现预览,通过创建一个窗口...

    JPG文件转换成BMP文件

    相反,BMP文件不进行任何压缩,直接存储像素颜色值,因此对于相同尺寸的图像,BMP文件通常远大于JPEG文件。 转换过程涉及以下几个关键步骤: 1. **读取JPG文件**:使用图像处理库,如Python的PIL(Pillow)或Java...

    读取并显示bmp文件的制作流程

    本篇文章将详细阐述如何读取并显示BMP文件的制作流程,旨在帮助初学者理解BMP文件的结构以及如何利用编程语言实现显示。 1. **BMP文件结构** BMP文件由两部分组成:文件头和图像数据。文件头包含信息如文件大小、...

    BMP文件处理

    解析BMP文件主要就是读取文件头和信息头,并根据这些信息解码像素数据。由于BMP文件是未压缩的,像素数据通常按行存储,从底部行(图像的最顶部)开始,逐行向上。对于24位BMP(真彩色),每个像素由红、绿、蓝三个8...

    BMP解析的详细讲解,是新手就来看看吧!

    在编程中,可以使用各种语言来解析BMP文件,例如C++、Python或Java。在实际应用中,我们可能会遇到不同版本的BMP文件,这就需要灵活地处理信息头和像素数据的不同格式。 总结一下,BMP文件解析涉及对文件结构的理解...

    bmp2mif java

    在Java语言环境下编写“bmp2mif”程序,可以利用Java丰富的I/O库和图像处理API来解析BMP文件。通常,这个程序会遵循以下步骤: 1. **读取BMP文件**:使用Java的`javax.imageio.ImageIO`类读取BMP文件,获取图像的...

    Android4.0下使用framebuffer抓屏并保存成bmp文件

    解析后,你需要将这些数据转换为BMP文件所需的格式。 4. **创建BMP文件**: BMP文件格式有特定的头部结构,包括文件头、信息头和颜色数据。你需要按照BMP格式的规范构造这些头部信息,并将解析后的framebuffer数据...

    按文件读取BMP位图

    1. **打开文件**:使用编程语言(如C++、Python或Java)的文件操作函数打开BMP文件。 2. **读取文件头**:BMP文件头包含两个部分:BITMAPFILEHEADER(BFH)和BITMAPINFOHEADER(BIH)。BFH包含文件的基本信息,如...

    Wlt2BmpDemo.rar_java wlt转jpg_wlt bmp_wlt图片转换_wlt文件_wlt转jpg

    android jni 将wlt图片转成bmp格式图片,支持32位armeabi架构手机

Global site tag (gtag.js) - Google Analytics