import javax.imageio.*;
import java.util.Arrays;
public class HelloWorld {
public static void main(String args[]) {
String readFormats[] = ImageIO.getReaderFormatNames();
String writeFormats[] = ImageIO.getWriterFormatNames();
System.out.println(“Readers: ” + Arrays.asList(readFormats));
System.out.println(“Writers: ” + Arrays.asList(writeFormats));
}
}
File f = new File(“c:imagesmyimage.gif”);
BufferedImage bi = ImageIO.read(f);
Java Image I/O API 会自动探测图片的格式并调用对应的插件进行解码,当安装了一个新 插件,新的格式会被自动理解,程序代码不需要改变。
BufferedImage bi;
File f = new File(“c:imagesmyimage.png”);
ImageIO.write(im, “png”, f);
Iterator readers = ImageIO.getImageReadersByFormatName(“gif”);
ImageReader reader = (ImageReader)readers.next();
Object source; // File or InputStream
ImageInputStream iis = ImageIO.createImageInputStream(source);
一旦有了输入源,可以把它与一个ImageReader对象关联起来:
reader.setInput(iis, true);
如果输入源文件包含多张图片,而程序不保证按顺序读取时,第二个参数应该设置为 false。对于那些只允许存储一张图片的文件格式,永远传递true是合理的。
当ImageReader对象有了输入源后,我们就可以获取图片信息而不用把整张图片数据都读入 内存。例如,调用reader.getImageWidth(0)可以让我们获得文件中第一张图片的宽度。一 个好的插件会试图解码文件的必要部分,去获得图片的宽度,而不用读取任何一个像素。
reader.setInput(iis, true);
接下来,指定图片区域:
import java.awt.Rectangle;
int imageIndex = 0;
int half_width = reader.getImageWidth(imageIndex)/2;
int half_height = reader.getImageHeight(imageIndex)/2;
Rectangle rect = new Rectangle(0, 0, half_width, half_height);
param.setSourceRegion(rect);
BufferedImage bi = reader.read(imageIndex, param);
结果是一张新图片,宽和高都只有原图片的一半。
param = reader.getDefaultImageParam();
param.setSourceSubsampling(3, 3, 0, 0);
BufferedImage bi3 = reader.read(0, param);
int thumbailIndex = 0;
BufferedImage bi;
bi = reader.readThumbnail(imageIndex, thumbnailIndex);
3.4 ImageWriter 类
就像我们可以用ImageIO 的一个方法获取某种图片格式的ImageReader对象一样,我们也可 以获取ImageWriter对象:
Iterator writers = ImageIO.getImageWritersByFormatName(“png”);
ImageWriter writer = (ImageWriter)writers.next();
一旦获取了一个ImageWriter对象,必须给它设置一个输出源ImageOutputStream。
File f = new File(“c:imagesmyimage.png”);
ImageOutputStream ios = ImageIO.createImageOutputStream(f);
writer.setOutput(ios);
最后,可以把图片写入到输出源:
BufferedImage bi;
writer.write(bi);
BufferedImage first_bi, second_bi;
IIOImage first_IIOImage = new IIOImage(first_bi, null, null);
IIOImage second_IIOImage = new IIOImage(second_bi, null, null);
writer.write(null, first_IIOImage, null);
if (writer.canInsertImage(1)) {
writer.writeInsert(1, second_IIOImage, null);
} else {
System.err.println(“Writer can’t append a second image!”);
}
略
3.8案例
package com.test.image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;
/**
* 读写图片
* @author taoww
* 参考:http://www.360doc.com/content/16/0224/16/12500151_537069462.shtml
*
*/
public class RWImage {
public static void main(String[] args) {
//simpleRWImage();
complexRWImage();
}
/**
* 读写图片简单方式
*/
public static void simpleRWImage(){
try {
//读取图片
File f1 = new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg");
BufferedImage bi=ImageIO.read(f1);
//将读取的图片写到本地
File f2 = new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\lihua.png");
if(!f2.exists()){
f2.createNewFile();
}
ImageIO.write(bi, "png", f2);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Java Image I/O API 提供了为编写复 杂程序的能力。
* 为了利用API的高级特性,应用程序应当直接使用类ImageReader和 ImageWriter读写图片
*/
public static void complexRWImage(){
try {
/**********************读取图片*********************************/
File f = new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\Chrysanthemum.jpg");
Iterator readers = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = (ImageReader)readers.next();
/*
* 获得了一个ImageReader对象,必须给它是指一个输入源。
* 大部分 ImageReader对象可以从ImageInputStream类输入源读取数据,
* ImageInputStream是Image I/O API定义的专用输入源
*/
ImageInputStream iis = ImageIO.createImageInputStream(f);
/*
* 一旦有了输入源,可以把它与一个ImageReader对象关联起来.
* 如果输入源文件包含多张图片,而程序不保证按顺序读取时,第二个参数应该设置为 false。
* 对于那些只允许存储一张图片的文件格式,永远传递true是合理的
*/
reader.setInput(iis, true);
/*
* 如果需要更多的控制,可以向read()方法传递一个ImageReadParam类型的参数。
* 一个 ImageReadParam对象可以让程序更好的利用内存。
* 它不仅允许指定一个感兴趣的区域,还 可以指定一个抽样因子,用于向下采样.
* */
ImageReadParam param=reader.getDefaultReadParam();
int imageIndex=0;
int halfWidth=reader.getWidth(imageIndex)/2;
int halfHegiht=reader.getHeight(imageIndex)/2;
Rectangle rectangle=new Rectangle(0,0,halfWidth,halfHegiht);
param.setSourceRegion(rectangle);
BufferedImage bi=reader.read(0, param);
/**********************写图片*********************************/
Iterator writes=ImageIO.getImageWritersByFormatName("png");
ImageWriter imageWriter=(ImageWriter)writes.next();
f=new File("C:\\Users\\Public\\Pictures\\Sample Pictures\\lihua.png");
ImageOutputStream iops=ImageIO.createImageOutputStream(f);
imageWriter.setOutput(iops);
imageWriter.write(bi);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
参考地址:http://www.360doc.com/content/16/0224/16/12500151_537069462.shtml