我们这里通过内存中构建出来一个图片并写出到文件中;首先我们先在内存中构建一张图片;然后再将内存中构建的图片写出到文件中,这里将内存中图片写入到文件中时可使用ImageIO提供的静态方法写出,也可以使用ImageWriter提供的方法写出。
内存中创建图片
private BufferedImage createBufferedImage() {
// 创建图片
BufferedImage bufferedImage = new BufferedImage(400, 200, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = bufferedImage.createGraphics();
// 设置背景
graphics.setBackground(Color.white);
graphics.clearRect(0,0,400,200);
// 设置文本
graphics.setColor(Color.blue);
graphics.setFont(new Font("楷体", Font.BOLD, 36));
graphics.drawString("你好,世界", 50, 50);
graphics.dispose();
return bufferedImage;
}
我们创建了一个图片,并设置了图片的背景色,并写入了你好,世界
ImageWriter写出图片
private static void writeByImageWriter(BufferedImage bufferedImage) throws IOException {
// 创建图片输出流
ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(new File("/home/mointor/hello.png"));
// 获取图片写出器
Iterator<ImageWriter> imageWriterIterator = ImageIO.getImageWritersByFormatName("png");
if (!imageWriterIterator.hasNext()) {
// 未找到图片写入对象
} else {
ImageWriter imageWriter = imageWriterIterator.next();
// 设置图片输出流
imageWriter.setOutput(imageOutputStream);
// 写出图片
imageWriter.write(bufferedImage);
}
}
首先我们使用ImageIO.createImageOutputStream创建了图片输出流,此方法提供了重载,可以通过文件(File)、输出流(OutputStream)、随机访问文件(RandomAccessFile)创建图片输出流;
ImageIO.getImageWritersByFormatName可以用于获取图片写出器对象,与创建图片读取器对象类似;获取到图片写出器之后需要设置图片输出流,用于指定图片写出的位置;最后使用write方法写出图片。
ImageIO写出图片
private void writeByImageIO(BufferedImage bufferedImage) throws IOException {
ImageIO.write(bufferedImage, "png", new File("/home/mointor/hello.png"));
}
ImageIO提供了静态方法write,能够直接写出图片;write方法提供了多个重载;可以向文件(File)、输出流(OutputStream)、图片输出流(ImageOutputStream)中写出图片。
其实ImageIO写出图片的方式,其实现原理也是使用ImageWriter,下面我们结合源码具体分析一下:
public static boolean write(RenderedImage im,
String formatName,
File output) throws IOException {
if (output == null) {
throw new IllegalArgumentException("output == null!");
}
// 根据文件格式获取图片写出器
ImageWriter writer = getWriter(im, formatName);
if (writer == null) {
/* Do not make changes in the file system if we have
* no appropriate writer.
*/
return false;
}
// 删除文件
output.delete();
// 创建图片输出流
ImageOutputStream stream = createImageOutputStream(output);
if (stream == null) {
throw new IIOException("Can't create an ImageOutputStream!");
}
try {
// 写出图片
return doWrite(im, writer, stream);
} finally {
stream.close();
}
}
private static ImageWriter getWriter(RenderedImage im,
String formatName) {
ImageTypeSpecifier type = ImageTypeSpecifier.createFromRenderedImage(im);
// 获取图片写出器
Iterator<ImageWriter> iter = getImageWriters(type, formatName);
if (iter.hasNext()) {
return iter.next();
} else {
return null;
}
}
private static boolean doWrite(RenderedImage im, ImageWriter writer,
ImageOutputStream output) throws IOException {
if (writer == null) {
return false;
}
// 设置图片输出流
writer.setOutput(output);
try {
// 写出图片
writer.write(im);
} finally {
writer.dispose();
output.flush();
}
return true;
}
从上面代码可以看出,ImageIO提供的write方法实现中使用的也是ImageWriter进行写出。
总结
ImageIO中提供的write方法,提供了多个重载方法写出图片;其实现原理是使用ImageWriter把图片写出。