如果你对图像处理感兴趣而且需要使用GIFJPEG和PNG以外的其它图像格式或者希望改善JPEG图像处理的性能但不知道到哪里寻找适当的方法或者需要通过几何运算(包括非线性变换)来处理图像不必再为此苦恼了答案就在这里——来自Sun公司的Java高级图像处理API和JAI图像I/O API RC JAI API是Java Media API的一部分与之相伴的还包括Java D APIJava D APIJava Speech API和其他一些APIJava高级图像处理API是作为Java规范请求(JSP)的一部分而开发的是对JSE version +版的扩展主要用于处理图像最初发布的版本是JDC(Java Developer Connection)提供了一个预览版 beta(最新进展情况请查阅l文件)与AWT和Java D相比JAI API提供了更丰富的图像处理包括对许多通用图像操作的内在支持 不过本文的目的不是讨论JAI API而是伴随这些API但分离到它自己的可安装库中的一组图像读写器(codec)类即Java高级图像处理图像I/O工具 RC该RC提供了可以插接到JSE 的图像I/O框架上的一些功能作为JSR一部分而开发的图像I/O API提供了一个支持不同图像格式的可插拔框架标准JSE 版本身支持GIFJPEG和PNG图像格式而JAI图像I/O RC则提供了更多主流图像格式的编码解码器只要加上针对操作平台的适当版本以前开发的应用程序就可以处理这些新的图像格式 要理解JAI图像I/O工具的使用需要首先了解图像I/O库在安装和介绍图像I/O工具包之前我们先看一看图像I/O库 图像I/O库 图像I/O库是JSE 的标准API放在javaximageio包内虽然这个包提供了两个接口和个类整个API实际上就是ImageIO类通过这个类可以弄清读写所支持的图像格式并对这些图像进行读写实际上这也就是整个API的全部内容 由于图像I/O库是一个可插拔的框架所支持的图像格式集不是固定不变的尽管随JSE 发布了一些标准格式但任何人都可以增加新的支持格式要查看有哪些格式可用可以使用下面的代码 import javaximageio*;import javautilArrays; public class GetFormats {public static void main(String args[]) {String readFormats[] = ImageIOgetReaderMIMETypes();String writeFormats[] = ImageIOgetWriterMIMETypes();Systemoutprintln(Readers: + ArraysasList(readFormats));Systemoutprintln(Writers: + ArraysasList(writeFormats));}} 运行该程序你会发现这个库支持读取GIFJPEG和PNG图像也支持写JPEG和PNG图像但是不支持写GIF文件 除了与像image/jpeg这样的MIME类型协同工作外ImageIO类还允许通过getReaderFormatNames和getWriterFormatNames方法使用JPEG这样的非正式名称此外通过getImageReadersBySuffix和getImageWritersBySuffix还可以了解是否存在针对特定文件扩展名的reader/writer存在 利用ImageIO类你所要做的事情不过是读javaximageiostreamImageInputStreamjavaioInputStreamjavaioFile或者URL结果会得到一个javaawtimageBufferedImage一旦拥有了BufferedImage你就可以指定需要的格式名把图像写回去(不仅仅是BufferImage任何实现RenderedImage接口的类都可以写)新的格式既可以与读取的格式相同也可以是不同的格式以便进行格式转换如果指定的格式没有可用的writer那么write方法就返回false否则如果找到了相应的writer就返回true String inputFilename = ;BufferedImage image = ImageIOread(inputFilename);String formatName = jpg; // desired formatString outputFilename = ;File outputFile = new File(outputFilename);boolean writerExists = ImageIOwrite(imageformatName outputFile); 为了说明图像I/O库的用法下面的例子使用JFileChooser提示输入图像文件名选中文件后再选择目标输出格式然后按下Save(保存)按钮保存完成后将重新读取图像并在一个新窗口内显示 import javaawt*; import javaawtevent*; import javaawtimage*; import javaxswing*; import javaio*; import *; import javaximageio*; public class Converting extends JFrame {JLabel promptLabel;JTextField prompt;JButton promptButton;JFileChooser fileChooser;JComboBox comboBox;?JButton saveButton;?public Converting() {super(Image Conversion);setDefaultCloseOperation(EXIT_ON_CLOSE);Container contentPane = getContentPane();JPanel inputPanel = new JPanel();promptLabel = new JLabel(Filename:);inputPaneladd(promptLabel);prompt = new JTextField();inputPaneladd(prompt);promptButton = new JButton(Browse);inputPaneladd(promptButton);contentPaneadd(inputPanel BorderLayoutNORTH); fileChooser = new JFileChooser();promptButtonaddActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {int returnValue = fileChoosershowOpenDialog(null);if (returnValue ==JFileChooserAPPROVE_OPTION) {File selectedFile = fileChoosergetSelectedFile(); if (selectedFile != null) {promptsetText(selectedFilegetAbsolutePath()); }}}}); JPanel outputPanel = new JPanel();String writerFormats[] = ImageIOgetWriterFormatNames();ComboBoxModel comboBoxModel = new DefaultComboBoxModel(writerFormats);comboBox = new JComboBox(comboBoxModel);outputPaneladd(comboBox);saveButton = new JButton(Save);outputPaneladd(saveButton);saveButtonaddActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {try {String name = promptgetText();File file = new File(name);if (fileexists()) {BufferedImage image = ImageIOread(filetoURL());if (image == null) {Systemerrprintln(Invalid input file format);} else { String selection =(String)comboBoxgetSelectedItem();String outputFilename = name + + selection;File outputFile = new File(outputFilename);boolean found = ImageIOwrite(image selection outputFile);if (found) {JDialog window = new JDialog();Container windowContent =windowgetContentPane();BufferedImage newImage =ImageIOread(outputFile);JLabel label = new JLabel(newImageIcon(newImage)); JScrollPane pane = newJScrollPane(label);windowContentadd(paneBorderLayoutCENTER);windowsetSize( );windowshow();} else {Systemerrprintln(Error saving);} }} else { Systemerrprintln(Bad filename);} } catch (MalformedURLException mur) {Systemerrprintln(Bad filename);} catch (IOException ioe) { Systemerrprintln(Error reading file); }}}); contentPaneadd(outputPanel BorderLayoutSOUTH); }public static void main(String args[]) {JFrame frame = new Converting();framepack();frameshow();}} 注意该程序没有硬编码任何文件类型而是询问图像I/O框架支持哪些文件类型安装Java高级图像处理图像I/O工具RC后还可以重新运行该程序你将会看到更多的存储格式读取其它格式的图像基本上无需改变代码也能工作用户只要选择不同的文件类型就可以了 |