JAVA实现对BMP图片的读取

标签: java bmp 图片 | 发表时间:2014-06-15 12:22 | 作者:
出处:http://www.iteye.com

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);
					}
				}
			}
		}
	}
}
 


 

 


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java bmp 图片] 推荐:

JAVA实现对BMP图片的读取

- - ITeye博客
BMP图片格式,是windows自带的一个图片格式,(*bmp),在windows的系统下都支持这种格式,bmp格式与设备无关的位图(DIB)格式,BMP简称位图,BMP的原始数据是没有经过压缩处理的  占用的空间比其它格式的图片要大.    BMP由四部分组成 ,位图文件头 , 位图信息头 ,  颜色 , 图像数据区.

BMP文件格式详解

- - 互联网 - ITeye博客
位图文件(Bitmap-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式. Windows 3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(device-dependent bitmap,DDB)文件格式.

Java图片加水印

- - CSDN博客推荐文章
pressText("真的好想你","3.jpg","宋体",Font.BOLD,0,20,200,200);. 作者:cjc211322 发表于2014-12-4 8:35:45 原文链接. 阅读:59 评论:0 查看评论.

java图片处理工具

- - CSDN博客推荐文章
作者:kuanghongjiang 发表于2015-2-1 15:45:51 原文链接. 阅读:0 评论:0 查看评论.

JAVA上传图片的缩放处理

- - CSDN博客推荐文章
  图片上传到服务器后,会根据情况将图片缩小成一个图标,我们可以利用java强大的图形处理功能,对上传的图片进行缩放处理.   下面的程序使用jdk1.4中最新的ImageIO对图片进行读写. 使用AffineTransform对图片进行缩放.   * @param fromdir 图片的原始目录.

Java中图片压缩处理

- - 编程语言 - ITeye博客
整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你可以使用bmp、png、gif等,至于压缩质量,可以通过BufferedImage来指定. 在C盘的temp下放置一张图片pic123.jpg,尽量找一个像素高一点的图片,这里我找了一张5616*3744的.

java图片裁切工具类

- - CSDN博客编程语言推荐文章
* @param x1 选择区域左上角的x坐标. * @param y1 选择区域左上角的y坐标. * @param width 选择区域的宽度. * @param height 选择区域的高度. * @param sourcePath 源图片路径. * @param descpath 裁切后图片的保存路径.

Java的图片处理工具类

- - CSDN博客推荐文章
public static String IMAGE_TYPE_GIF = "gif";// 图形交换格式. public static String IMAGE_TYPE_JPG = "jpg";// 联合照片专家组. public static String IMAGE_TYPE_JPEG = "jpeg";// 联合照片专家组.

Java为图片生成缩略图

- - 编程语言 - ITeye博客
需要为一张图片生成缩略图. 可以通过开源jar包thumbnailator-0.4.8.jar中提供的类来实现. 解压jar包可以看到测试类:ThumbnailatorTest.java,其具体代码如下:. * size(width,height) 若图片横比200小,高比300小,不变. * 若图片横比200小,高比300大,高缩小到300,图片比例不变 若图片横比200大,高比300小,横缩小到200,图片比例不变.

java带图片的邮件发送方法实现

- - CSDN博客编程语言推荐文章
// JavaMail需要Properties来创建一个session对象. 它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机. // properties.put("mail.smtp.host", "mailcas.chinapnr.com");// 设置smtp主机. properties.put("mail.smtp.host", "smtp.163.com");// 设置smtp主机.