`
甘艳丽
  • 浏览: 52322 次
  • 性别: Icon_minigender_2
  • 来自: 湖南
社区版块
存档分类
最新评论

BMP文件格式小总结

阅读更多

 1.BMP是一种与硬件无关的图像文件格式,它所占用的空间很大,不采用其他任何压缩,它的深度可选1个字节,4个字节,8个字节,24个字节,我们通常所说的真彩色就是24个字节,BMP图像的扫描方式是从下往上,从左到右,当文件的宽度不是4的倍数是,要通过补0来使文件是4的倍数,但是由于BMP图像文件占得内存太大,我们平常都不用这种格式。

 

 

2.BMP文件结构

   位图文件 头数据结构,它包含BMP图像文件的内容,显示内容等信喜,大小是14个字节。

   位图信息数据结构,它包含了图像的宽和高,通常我们要显示一张图片时,必须要把这两个数据从图像中读出来。

   调色板 像我们说的24位真彩色图的BMP不需要调色板

   位图数据  这一项比较重要,当要显示一张图片时,一定要遍历整个图片,从下往上,从左往右依次得到三种不同的颜色。

3.BMP文件解析实现

要将既定位置的图片显示出来,必须要用到输入流,因为输入流是将硬盘中的数据读到内存中来,不能只用输入流,还必须配合使用dataInputStream 或者是BufferedInputStream,

FileInputStream fis=new FileInputStream(path);//创建文件输入流
BufferedInputStream bis=new BufferedInputStream(fis);//将文件流打包

 

 其实不用缓冲流而用dataInputStream也行,效果是一样的,当创建好输入流之后,就应该读取既定位置图像的头文件,以及图像的宽度和高度。

                                               int Btop=14;//头部的长度
			byte []b=new byte[Btop];//定义一个存入图像头部的数组
			bis.read(b,0,Btop);//将图像头部的14个字节读到数组b中
			int blien=40;//读入位图信息头
			byte [] bc=new byte[blien];//定义一个存入位图信息头的数组
			bis.read(bc,0,blien);//将位图信息头的40个字节读到数组bc中
			image_width=changInt(bc,7);//获取图形的宽度
			image_height=changInt(bc,11);//获取图形的高度
                               public static int changInt(byte []bi,int i){
		return(((int)bi[i]&0xFF)<<24)|(((int)bi[i-1]&0xFF)<<16)|(((int)bi[i-2]&0xFF)<<8)|((int)bi[i-3]&0xFF);
	}

 

 因为图像的宽和高是存在第7个和第11个位置,所以传的索引值为7和11,存在数组中的是字节,所以要将byte转化成int型,又因为它读出来的位置是倒序的,所以第i个位置需左移24位才能到高8位,依次类推,要得到int值,只需将它们每8个字节先与0xff进行逻辑与,在将它们逻辑或,就可得到想要的值。

现在要做的就是读取位图数据:

 public void readRGB(BufferedInputStream bis){
				if(!(image_width*3%4==0)){
				 skip_width = 4-image_width*3%4;
			}
				//装载RGB颜色的数据数组
			imageR=new int[image_height][image_width];
			imageG=new int[image_height][image_width];
			imageB=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=bis.read();
					int green=bis.read();
					int red=bis.read();
					imageR[h][w]=red;
					imageG[h][w]=green;
					imageB[h][w]=blue;
//					if(w==0){//跳过补0项
//						System.out.println(dis.skipBytes(skip_width));
//					}
				}catch(IOException e){
					e.printStackTrace();
				}
				if(w==0){
					try{
						bis.skip(skip_width);
					}  catch (IOException e) {
						e.printStackTrace();
					}
				}
				}
			}
	

 

 当我们读取了位图数据之后,需要将图像显示出来,要显示图片肯定要需要窗体,所以我们再需要写一个方法,该方法是用来显示窗体的。

public void showUI(String path){
			 
			this.setTitle(path);
			this.setLocationRelativeTo(null);
			this.setSize(image_width,image_height);//弹出一个图片大的大小的窗体
			this.setResizable(false);
			this.setDefaultCloseOperation(3);
			this.setVisible(true);//窗体可见
			graphics=this.getGraphics();//得到画布
			 repaint();
			 }

 

 

 我们将图像的信息读取出来之后,就要将它显示出来,故要写一个paint方法:

/**
	 * 把的到得数据显示出来
	 */
	public void paint(Graphics g){
		for(int h=0;h<image_height;h++){
			for(int w=0;w<image_width;w++){
				g.setColor(new java.awt.Color(imageR[h][w],imageG[h][w],imageB[h][w]));
				g.drawLine(w, h, w, h);
				
			}
		}
	}

 

 整个BMP文件格式解析就已经实现了,实验的结果是:

 操作中遇到的问题:虽然BMP文件解析的思路比较明确,但是在实际操作中经常遇到问题:比如我所有程序写好之后,我图片没有改为BMP格式,出现java.lang.outOfmemorryError错误,还有当我画图时,用的是g.fillOval(w,h,w,h)方法时,出现的图形刚开始怪模怪样,到最后才呈现出源图的效果。还有就是那个不是4的倍数时,为什么是if(!(image_width*3%4==0))而不是if(!image_width%4==0),

 

 

  • 大小: 638.3 KB
分享到:
评论
1 楼 林晓盼 2011-06-02  
写得不错!代码也清晰,向你学习!

相关推荐

    BMP文件格式分析

    ### BMP文件格式分析 #### 一、概述 BMP(Bitmap-File)文件是一种常见的图像文件格式,由Microsoft开发并在Windows环境中广泛使用。BMP文件的主要特点在于它们能够以无损压缩的方式存储图像数据,这使得BMP文件...

    bmp文件格式分析分析

    ### BMP文件格式详解 #### 一、概述 BMP(Bitmap File)是一种常见的图像文件格式,由Microsoft设计,广泛应用于Windows操作系统及其相关软件中。BMP文件格式的特点在于它能够无损地存储图像数据,并且与大多数图形...

    BMP 文件格式详解

    - **现代BMP文件格式**:随着技术的发展,Windows 3.0及后续版本引入了一种新的BMP文件格式——“设备无关位图”(Device-Independent Bitmap,简称DIB),这一改进允许BMP文件可以在不同类型的显示设备上正确显示,...

    BMP文件格式详细解答

    ### BMP文件格式详解 BMP(Bitmap)是一种用于存储位图图像的标准文件格式,由Microsoft在Windows操作系统中引入。BMP格式的特点是无压缩或可选压缩,支持单色、灰度以及各种彩色图像,其主要优点是图像质量高且跨...

    BMP文件格式探索——初学者必看经典

    总结一下,BMP文件格式的核心知识点包括:文件头的结构、图像数据的组织方式、色彩深度的概念、以及未压缩的特性。通过分析和实验,初学者可以逐步掌握这些概念,并进一步探索图像处理的广阔世界。提供的文件资源...

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

    BMP文件格式是一个二进制文件,包含图像宽度、高度、颜色深度、像素数据等信息。当我们将BMP文件转换为TXT时,我们需要解析这些二进制数据并将其转化为人类可读的文本格式。这通常包括: 1. 文件头:BMP文件以一个...

    C 语言两步实现 RAW 和 BMP 图片格式转换

    4. 写入 BMP 像素数据:将处理过的 RGB 像素数据按照 BMP 文件格式的要求,按行优先顺序写入文件。由于 BMP 文件是底部行优先,可能需要先颠倒原始图像的行顺序。 5. 保存 BMP 文件:最后,将生成的 BMP 文件头和...

    BMP文件格式,写出具体的文件内容

    ### BMP文件格式详解 BMP(Bitmap)是一种用于存储位图图像的标准文件格式,由Microsoft在Windows操作系统中提出。BMP格式的特点在于它能够提供无损压缩,这意味着图像数据在保存过程中不会发生任何质量损失。这...

    bmp文件格式介绍

    ### BMP文件格式详解 #### 一、概述 BMP(Bitmap)文件格式是一种常见的位图图像格式,在Windows操作系统中被广泛应用。它具有无损压缩的特点,适用于存储原始图像数据,尤其是对于那些需要保持最高画质的应用场景...

    将多个bmp文件合并成一个bmp文件

    总结起来,“将多个bmp文件合并成一个bmp文件”的技术是游戏动画实现的关键步骤,它优化了资源管理和性能,使得游戏运行更加流畅。在实际开发中,结合使用合适的工具和编程技巧,可以更高效地实现这一功能。

    bmp文件格式分析数据

    ### BMP文件格式分析 BMP(Bitmap)是一种用于存储位图图像的标准文件格式,它由Microsoft在Windows操作系统中引入,并广泛应用于多种操作系统中。BMP文件格式的特点是无压缩、结构简单,支持单色和彩色图像,且...

    读取bmp文件的十六进制代码

    总结来说,读取BMP文件的十六进制代码涉及到理解BMP文件结构、使用编程语言的文件操作函数以及将二进制数据转换为可读的十六进制表示。这个过程可以帮助我们更好地理解和调试与图像相关的程序,同时对计算机视觉领域...

    简单的读取BMP文件并显示的程序

    总结来说,读取和显示BMP文件涉及理解其文件结构,以及使用合适的编程语言和库来解析和处理这些数据。在这个过程中,Pillow库提供了简洁易用的接口,而手动解析则有助于深入理解BMP格式的细节。通过实践,你可以...

    bmp文件的读取

    BMP文件格式的特点是无压缩、无损失,支持多种颜色深度,如24位色和32位色等。 #### 二、BMP 文件结构解析 BMP文件主要由三部分组成:文件头、信息头以及像素数据。下面对这些部分进行详细介绍: - **文件头** (`...

    在bmp中隐藏文件

    总结来说,在 BMP 文件中隐藏文件是一种巧妙的数据隐藏手段,它利用了 BMP 格式的特点和人类视觉对微小差异的不敏感性。了解这种技术不仅有助于提高信息安全意识,还能够扩展对数字媒体处理和信息隐藏的理解。

    bmp图片文件结构总结

    "bmp图片文件结构总结" bmp 文件结构可以分为四个部分:bmp 文件头、位图信息头、调色板和位图数据。 bmp 文件头提供文件的格式、大小等信息。它的结构如下: * 第一个字节表示 Windows 支持的位图格式,值为 'BM...

    BMP文件读取

    总结来说,读取BMP文件的关键在于理解其文件结构,并正确地解析头部信息和像素数据。在VC++中,可以利用标准库函数和自定义结构体实现这个过程。通过上述方法,你可以在自己的VC++工程中实现对BMP文件的读取和处理。

    读取BMP文件并显示_C#读取BMP文件并显示_tropicalvsr_

    总结起来,C#提供了一套强大的图像处理工具,使得读取和显示BMP文件变得轻松。通过利用System.Drawing命名空间中的Bitmap类,我们可以轻松加载BMP文件,并通过PictureBox将其显示在Windows窗体应用程序中。对于更...

    将小文件隐藏在BMP文件中

    通常,这样的过程会涉及到对BMP文件格式的理解,包括图像的头部信息、像素数据的组织方式,以及如何在不影响图像显示的前提下,安全地嵌入额外的数据。 在实际应用中,这种方法可能用于保护敏感信息,例如在需要...

    读取RAW图像并转换为BMP文件

    在图像处理领域,RAW图像和BMP文件是两种常见的格式,它们各有特点,适用于不同的应用场景。本教程将深入探讨如何使用C++编程语言从RAW格式转换为BMP格式,这对于理解图像处理的基本原理以及开发相关应用非常有帮助...

Global site tag (gtag.js) - Google Analytics