`
百合不是茶
  • 浏览: 356010 次
社区版块
存档分类
最新评论

JAVA实现对BMP图片的读取

阅读更多

BMP图片格式,是windows自带的一个图片格式,(*bmp),在windows的系统下都支持这种格式,bmp格式与设备无关的位图(DIB)格式,BMP简称位图,BMP的原始数据是没有经过压缩处理的  占用的空间比其它格式的图片要大

 

   BMP由四部分组成 ,位图文件头 , 位图信息头 ,  颜色 , 图像数据区

 

BMP图片是三个字节为一个颜色保存,将字节拼接为int需要使用位移来做

 

位图文件头 (12个字节):

 0000-0001:文件标识,为字母ASCII码“BM”,42 4D。

0002-0005:整个文件大小,单位字节。
0006-0009:这个位置的数字是被微软保留的
000A-000D:记录图像数据区的起始位置。从文件开始到位图数据(bitmap data)之间的偏移量。 
位图信息头()
000E-0011:图像描述信息块的大小
0012-0015:图像宽度。以像素为单位。
0016-0019:图像高度。以像素为单位。
001A-001B:图像的plane总数(恒为1)。
001C-001D:记录像素,也就是颜色。1 - Monochrome bitmap,4 - 16 color bitmap,8 - 256 color bitmap,F - 16位位图,18 - 24bit (true color) bitmap,20 - 32位位图。

001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩;3:Bitfields压缩)。
0022-0025:图像区数据的大小。单位字节,该数必须是4的倍数。
0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
002E-0031:此图像所用的颜色数。

0032-0035:指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要。



 

颜色
每一个字节表示一个颜色 r 0~255 g  0~255  b 0~255  保留一位  
 
图像数据区
从下到上 从左往右的顺序扫描
 
 
JAVA写一个读取BMP图片
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;

import java.awt.Graphics;
import java.io.BufferedInputStream;
import java.io.FileInputStream;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 图片查看器的窗口
 * 
 * @author Administrator
 * 
 */
public class priUI extends JFrame {
	public static void main(String[] args) {
		priUI ui = new priUI();
		ui.initUI();
	}

	public void initUI() {

		this.setSize(600, 500);
		this.setTitle("图片查看器");

		// 设置布局
		FlowLayout layout = new FlowLayout();
		this.setLayout(layout);

		JPanel center = new myPanel();
		center.setPreferredSize(new Dimension(400, 300));
		center.setBackground(Color.WHITE);
		this.add(center);

		this.setDefaultCloseOperation(3);
		this.setVisible(true);
	}

	/**
	 * 读取BMP文件的方法(BMP24位)
	 */

	public int[][] readFile(String path) {

		try {
			// 创建读取文件的字节流
			FileInputStream fis = new FileInputStream(path);
			BufferedInputStream bis = new BufferedInputStream(fis);
			// 读取时丢掉前面的18位,
			// 读取图片的18~21的宽度
			bis.skip(18);
			byte[] b = new byte[4];
			bis.read(b);
			// 读取图片的高度22~25
			byte[] b2 = new byte[4];
			bis.read(b2);

			// 得到图片的高度和宽度
			int width = byte2Int(b);
			int heigth = byte2Int(b2);
			// 使用数组保存得图片的高度和宽度
			int[][] date = new int[heigth][width];

			int skipnum = 0;
			if (width * 3 / 4 != 0) {
				skipnum = 4 - width * 3 % 4;
			}
			// 读取位图中的数据,位图中数据时从54位开始的,在读取数据前要丢掉前面的数据
			bis.skip(28);
			for (int i = 0; i < date.length; i++) {
				for (int j = 0; j < date[i].length; j++) {
					// bmp的图片在window里面世3个byte为一个像素
					int blue = bis.read();
					int green = bis.read();
					int red = bis.read();
					// 创建一个Color对象,将rgb作为参数传入其中
					Color c = new Color(red, green, blue);
					// Color c = new Color(blue,green,red);
					// 将得到的像素保存到date数组中
					date[i][j] = c.getRGB();
				}
				// 如果补0的个数不为0,则需要跳过这些补上的0
				if (skipnum != 0) {
					bis.skip(skipnum);
				}
			}
			return date;
		} catch (Exception e) {
			e.printStackTrace();

		}
		return null;

	}

	// 将四个byte拼接成一个int
	public int byte2Int(byte[] by) {
		int t1 = by[3] & 0xff;
		int t2 = by[2] & 0xff;
		int t3 = by[1] & 0xff;
		int t4 = by[0] & 0xff;
		int num = t1 << 24 | t2 << 16 | t3 << 8 | t4;
		return num;

	}

	class myPanel extends JPanel {
		public void paint(Graphics g) {
			super.paint(g);
			// 读取数据
			int[][] date = readFile("C:\\Users\\Administrator\\Desktop\\meinv.bmp");
			// 判断是否存在
			if (date != null) {
				// this.setPreferredSize(new
				// Dimension(date[0].length,date.length));
				this.setPreferredSize(new Dimension(date[0].length, date.length));
				// 遍历
				for (int i = 0; i < date.length; i++) {
					for (int j = 0; j < date[i].length; j++) {
						Color c = new Color(date[i][j]);
						g.setColor(c);
						g.drawLine(j, date.length - i, j, date.length - i);
					}
				}
			}
		}
	}
}
 


 

 
1
0
分享到:
评论
2 楼 bewithme 2014-06-16  
很不错,可以很好的学习bmp图片的数据结构,也可以基于此去实现相应的图片底层处理,不过int[][] date = new int[heigth][width];这里的 date是不是应该为 data才对呀,变量命名是不是也该严格点,然后希望作者多发几篇类似的,比说说jpg ,png等格式图片都介绍一下。
1 楼 Function 2014-06-16  
ImageIO

相关推荐

    用java读取bmp格式图片文件

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

    Java读取所有色bmp图片格式

    使用这个工具类,你可以方便地读取各种颜色深度的BMP图片,将其转换为Java可以操作的图像对象。在实际应用中,你可能还需要考虑图像的旋转、缩放、裁剪等几何处理,以及颜色空间转换、滤波等图像处理操作。这些都是`...

    java语言读取bmp文件

    读取BMP文件并用Java进行处理涉及到对BMP文件格式的理解、字节序的转换以及利用Java AWT库进行图像显示。虽然Java本身不直接支持BMP文件的读取,但通过编写适当的代码,可以实现这一功能,进而为开发图像处理应用...

    Java实现在bmp图像文件中隐藏与导出信息.doc

    在实现过程中,Java 提供的 `java.awt.image.BufferedImage` 类可以用于读取、修改和保存 BMP 图像。通过使用 `getRGB()` 和 `setRGB()` 方法,可以访问和修改图像的每个像素。同时,可以使用 `java.io` 包中的类来...

    利用java实现画图板和保存读取BMP格式的图片(一)

    在本篇博文中,我们将探讨如何使用Java编程语言来实现一个简单的画图板应用程序,并学习如何保存和读取BMP(Bitmap)格式的图片。BMP是一种无损图像格式,通常用于存储像素数据,便于程序处理。以下是实现这一功能所...

    java 实现 bmp 转 jpg

    1. **读取BMP文件**:使用Java的`java.awt.image.BufferedImage`类来读取BMP文件。BMP文件的图像数据是按行存放的,每行数据可能需要填充以保持字节对齐。 ```java FileInputStream fis = new FileInputStream(...

    BMP图片的读取和再存储

    本教程主要探讨如何在编程环境中读取和再存储BMP图片,同时结合批处理操作,提高效率。 首先,我们要理解BMP文件的结构。BMP文件通常包含图像头部信息、颜色表(如果使用了索引颜色)以及像素数据。头部信息包括...

    java实现的LSB顺序隐写

    1、使用java ImageIO读取图片,获取其RGB通道信息。 2、使用java NIO读取被嵌入的文件,将其转换为byte数组,需要特别指出的是原生方法得到是byte类型的数组,但是算法实现需要更加精细的操作,所以还需要对得到的...

    一个读取BMP图像的程序

    BMP(Bitmap)是一种常见的位图图像文件格式,广泛用于Windows和OS/2操作系统中。...通过理解和掌握这些知识点,你可以编写一个能够读取BMP图像的程序,并将其嵌入到你的项目中,实现对图像的各种操作。

    读取bmp图片输出RGB值

    3. **读取像素数据**:使用编程语言(如Python、C++或Java)的文件操作函数读取图像数据。每读取3个字节,我们就可以得到一个像素的RGB值。 4. **输出到TXT**:将读取到的RGB值写入TXT文件,可以采用逗号分隔每组...

    java对bmp格式图象的处理.rar_bmp java_bmp处理_java .bmp

    在Java编程语言中,处理BMP(Bitmap)格式的图像是一项相对复杂的任务,因为与JPEG或PNG等其他流行格式相比,Java的标准库对BMP的支持并不直接。标题和描述指出,由于Java内置的图像处理功能有限,特别是对于BMP这种...

    bmp图像的简单处理

    在本教程中,我们将深入探讨如何对BMP图像进行简单的处理,包括读取、修改和保存。 1. **BMP文件结构** BMP文件由头信息和像素数据两部分组成。头信息包含了关于图像的基本信息,如宽度、高度、颜色深度等。常见的...

    Java应用程序读取图片内容.zip

    在Java编程语言中,读取图片内容是一项常见的任务,尤其在开发图形用户界面(GUI)应用、处理图像数据或进行图像分析时。本教程将详细解释如何使用Java来读取和处理图片。以下是一些核心知识点: 1. **Java Image I...

    bmp格式图片转换为raw格式

    在图像处理领域,格式转换是常见的...总的来说,BMP到RAW的转换涉及到对图像文件格式的理解,包括文件结构、颜色模式和数据布局。通过这个转换过程,我们可以更好地掌握图像数据的处理,从而在各种应用场景中灵活运用。

    java画图程序(java画图 java 编辑保存读取jpg图片)

    `ImageIO.read()`用于读取图片,`ImageIO.write()`用于保存图片。在这个程序中,这些方法很可能被用来加载和保存JPEG图片。 3. **BufferedImage 类**: `java.awt.image.BufferedImage`是Java中用于存储和操作图像的...

    BMP图像直方图均衡和灰度变换

    使用Java编写代码来处理8位BMP图像,意味着将涉及基本的文件I/O操作,以及对像素数据的直接操作。提供的资源包括“lips32.bmp”和“lips8.bmp”这样的验证图像,以及.classpath、.project、src、.settings和bin等...

    BMP图像转16进制数组

    在实际应用中,这可能涉及使用编程语言如Python、C++或Java来实现。例如,在Python中,可以使用PIL(Pillow)库来读取BMP文件,然后通过循环遍历像素,将每个像素的RGB值转换为16进制字符串,并存入列表。 这个转换...

    JAVA BMP解码 超详细解释

    在JAVA中,处理BMP图像时,我们需要理解其内部结构并进行解码,以便正确地读取和显示这些图像。本文将深入探讨JAVA如何对BMP文件进行解码,包括文件头、信息头、调色板和像素数据等关键部分。 1. **文件头(File ...

    BMP_RGB.rar_BGR BMP_BMP rgb bgr_bmp RGB_rgb 存储 bmp_读取bmp

    具体实现可能涉及到编程语言如C++、Python或Java,利用它们提供的文件I/O和图像处理库。 总结来说,BMP文件的读取和处理是计算机图形学中的基础技能,而BGR与RGB的转换则是一个常见的图像处理操作。了解这些知识点...

    Java读取图片分辨率依赖

    在Java编程环境中,读取图片分辨率是一项常见的任务,特别是在处理图像数据或进行图像分析时。为了实现这个功能,开发者通常需要依赖一些库来简化工作。在这个场景中,提到的两个库——`metadata-extractor-2.8.1....

Global site tag (gtag.js) - Google Analytics