Java实现将BufferedImage转换并保存为BMP格式文件

4星 · 超过85%的资源 需积分: 50 42 下载量 18 浏览量 更新于2024-09-15 收藏 10KB TXT 举报
"Java代码示例,用于将BufferedImage对象保存为BMP格式的文件,主要涉及BMP文件头结构的定义和填充" 在Java中,处理图像文件时,我们可能会遇到需要将BufferedImage对象保存为不同的文件格式,如BMP(Bitmap)格式。BMP是一种未压缩的位图文件格式,广泛用于Windows操作系统。以下内容详细解释了如何将BufferedImage保存为BMP格式,并介绍了BMP文件头结构。 1. BufferedImage类:BufferedImage是Java AWT(Abstract Window Toolkit)包中的一个类,它提供了一个二维的像素缓冲区,可以用于创建、编辑和显示图像。这个类允许我们访问和修改图像的每个像素,提供了丰富的图像操作功能。 2. BMP文件格式:BMP文件由文件头和图像数据两部分组成。文件头包含关于图像的基本信息,例如图像尺寸、颜色深度等。在Java中,我们需要手动构建这个文件头,以符合BMP格式的要求。 3. BMP文件头结构: - bfType:这是两个字节的数据,标识文件类型,对于BMP文件应为0x424D('B'和'M'的ASCII码)。 - bfSize:这是四个字节的数据,表示整个BMP文件的大小,包括文件头和图像数据。 - bfReserved1 和 bfReserved2:这两个是两个字节的保留字段,通常设置为0。 - bfOffBits:这是四个字节的数据,指出图像数据在文件中的偏移量,即从文件头开始到图像数据的字节数。 4. 示例代码中的BMPFileHeader类:这个类是用来封装BMP文件头信息的。它有三个成员变量:data(用于存储文件头的字节数据),size(表示文件大小),以及offset(图像数据的偏移量)。类的构造函数接受文件大小和偏移量参数,然后填充data数组。注意,由于Java中字节是 signed 的,因此在处理大数值时需要使用位右移运算符(>>>)来分步存储。 5. 将BufferedImage保存为BMP格式: - 首先,你需要创建一个BMPFileHeader实例,传递图像的总大小和图像数据在文件中的偏移量。 - 然后,你需要获取BufferedImage的像素数据。这可以通过调用BufferedImage的getRGB方法完成,得到一个整数数组,每个元素代表一个像素的颜色信息。 - 最后,你需要将文件头和图像数据写入输出流。你可以使用java.io.FileOutputStream来实现这一点,先写入文件头,然后将图像数据转换为字节数组并写入。 6. 注意事项: - BMP文件不支持透明度,如果BufferedImage包含透明像素,透明信息将会丢失。 - BMP文件的图像数据通常按行存储,从底部到顶部,每行可能需要填充额外的字节以确保行的长度是4字节的倍数。 - BMP文件的颜色深度可以根据需要调整,常见的有24位(每个像素RGB三通道各8位)和8位(256色索引)。 将BufferedImage保存为BMP格式涉及理解BMP文件结构,创建文件头,获取和转换图像数据,最后将所有信息写入输出流。这个过程需要对Java的IO操作和图像处理有深入的理解。
2019-12-13 上传
package com.ylw.p2p.common.utils; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FileUtils { public final static Map IMG_FILE_TYPE_MAP = new HashMap(); /** * @Description: 图片文件上传 * @author Xiao.Sky * @creaetime 2015年4月17日下午5:20:27 * @param request * @param response * @param photo * @param strtmp * 文件名称 xxx.jpg * @param path * 文件路径 * @param num * @return */ public static boolean updatePhoto(HttpServletRequest request,HttpServletResponse response, File photo, String strtmp,String path, long num) { File dir = new File(path); // 如果不存在就创建次文件夹 if (!dir.exists()) { dir.mkdirs(); } File newFile = new File(dir, strtmp); // 如果存在此文件就删除此文件 if (newFile.exists()) newFile.delete(); BufferedInputStream bis = null; FileInputStream fis = null; try { fis = new FileInputStream(photo); FileOutputStream fos = new FileOutputStream(newFile); BufferedImage src = ImageIO.read(fis); ImageIO.write(src, "png", fos); } catch (Exception e) { e.printStackTrace(); } finally { try { if (null != bis) { bis.close(); } if (null != fis) { fis.close(); } } catch (IOException e) { e.printStackTrace(); } } return true; } /** * * @Description: 普通文件上传 * @author Xiao.Sky * @creaetime 2015年4月23