王朝网络
分享
 
 
 

高级图像处理图像I/OAPIRC1.0

王朝other·作者佚名  2008-05-31
宽屏版  字体: |||超大  

假如你对图像处理感爱好,而且需要使用GIF、JPEG和PNG以外的其它图像格式,或者希望改善JPEG图像处理的性能但不知道到哪里寻找适当的方法,或者需要通过几何运算(包括非线性变换)来处理图像,不必再为此苦恼了,答案就在这里――来自Sun公司的Java高级图像处理API和JAI图像I/O API 1.0 RC。

JAI API是Java Media API的一部分,与之相伴的还包括Java 2D API、Java 3D API、Java Speech API和其他一些API。Java高级图像处理API是作为Java规范请求(jsp)34的一部分而开发的,是对J2SE version 1.3+版的扩展,主要用于处理图像。最初发布的版本是1.0,JDC(Java Developer Connection)提供了一个预览版1.1.2 beta。(最新进展情况请查阅README.Html文件。)与AWT和Java 2D相比,JAI API提供了更丰富的图像处理,包括对许多通用图像操作的内在支持。

不过本文的目的不是讨论JAI API,而是伴随这些API但分离到它自己的可安装库中的一组图像读写器(codec)类,即Java高级图像处理图像I/O工具1.0 RC。该RC提供了可以插接到J2SE 1.4的图像I/O框架上的一些功能。作为JSR-15一部分而开发的图像I/O API提供了一个支持不同图像格式的可插拔框架。标准J2SE 1.4版本身支持GIF、JPEG和PNG图像格式,而JAI图像I/O RC则提供了更多主流图像格式的编码解码器。只要加上针对操作平台的适当版本,以前开发的应用程序就可以处理这些新的图像格式。

要理解JAI图像I/O工具的使用,需要首先了解图像I/O库。在安装和介绍图像I/O工具包之前,我们先看一看图像I/O库。

图像I/O库

图像I/O库是J2SE 1.4的标准API,放在javax.imageio包内。虽然这个包提供了两个接口和9个类,整个API实际上就是ImageIO类。通过这个类可以弄清读写所支持的图像格式并对这些图像进行读写,实际上这也就是整个API的全部内容。

由于图像I/O库是一个可插拔的框架,所支持的图像格式集不是固定不变的。尽管随J2SE 1.4发布了一些标准格式,但任何人都可以增加新的支持格式。要查看有哪些格式可用,可以使用下面的代码:

import javax.imageio.*;import java.util.Arrays;

public class GetFormats {public static void main(String args[]) {String readFormats[] = ImageIO.getReaderMIMETypes();String writeFormats[] = ImageIO.getWriterMIMETypes();System.out.println("Readers: " + Arrays.asList(readFormats));System.out.println("Writers: " + Arrays.asList(writeFormats));}}

运行该程序,你会发现这个库支持读取GIF、JPEG和PNG图像,也支持写JPEG和PNG图像,但是不支持写GIF文件。

除了与像image/jpeg这样的MIME类型协同工作外,ImageIO类还答应通过getReaderFormatNames和getWriterFormatNames方法使用JPEG这样的非正式名称。此外,通过getImageReadersBySuffix和getImageWritersBySuffix还可以了解是否存在针对特定文件扩展名的reader/writer存在。

利用ImageIO类,你所要做的事情不过是读javax.imageio.stream.ImageInputStream、java.io.InputStream、java.io.File或者java.net.URL,结果会得到一个java.awt.image.BufferedImage。一旦拥有了BufferedImage,你就可以指定需要的格式名把图像写回去。(不仅仅是BufferImage,任何实现RenderedImage接口的类都可以写。)新的格式既可以与读取的格式相同,也可以是不同的格式以便进行格式转换。假如指定的格式没有可用的writer,那么write方法就返回false,否则假如找到了相应的writer就返回true。

String inputFilename = ...;BufferedImage image = ImageIO.read(inputFilename);...String formatName = "jpg"; // desired formatString outputFilename = ...;File outputFile = new File(outputFilename);boolean writerExists = ImageIO.write(image,formatName, outputFile);

为了说明图像I/O库的用法,下面的例子使用JFileChooser提示输入图像文件名。选中文件后再选择目标输出格式,然后按下“Save(保存)”按钮。保存完成后,将重新读取图像并在一个新窗口内显示。

import java.awt.*;

import java.awt.event.*;

import java.awt.image.*;

import javax.swing.*;

import java.io.*;

import java.net.*;

import javax.imageio.*;

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:");inputPanel.add(promptLabel);prompt = new JTextField(20);inputPanel.add(prompt);promptButton = new JButton("Browse");inputPanel.add(promptButton);contentPane.add(inputPanel, BorderLayout.NORTH);

fileChooser = new JFileChooser();promptButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {int returnValue = fileChooser.showOpenDialog(null);if (returnValue ==JFileChooser.APPROVE_OPTION) {File selectedFile = fileChooser.getSelectedFile(); if (selectedFile != null) {prompt.setText(selectedFile.getAbsolutePath()); }}}});

JPanel outputPanel = new JPanel();String writerFormats[] = ImageIO.getWriterFormatNames();ComboBoxModel comboBoxModel = new DefaultComboBoxModel(writerFormats);comboBox = new JComboBox(comboBoxModel);outputPanel.add(comboBox);saveButton = new JButton("Save");outputPanel.add(saveButton);saveButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {try {String name = prompt.getText();File file = new File(name);if (file.exists()) {BufferedImage image = ImageIO.read(file.toURL());if (image == null) {System.err.println("Invalid input file format");} else { String selection =(String)comboBox.getSelectedItem();String outputFilename = name +"." + selection;File outputFile = new File(outputFilename);boolean found = ImageIO.write(image, selection, outputFile);if (found) {JDialog window = new JDialog();Container windowContent =window.getContentPane();BufferedImage newImage =ImageIO.read(outputFile);JLabel label = new JLabel(newImageIcon(newImage)); JScrollPane pane = newJScrollPane(label);windowContent.add(pane,BorderLayout.CENTER);window.setSize(300, 300);window.show();} else {System.err.println("Error saving");} }} else { System.err.println("Bad filename");} } catch (MalformedURLException mur) {System.err.println("Bad filename");} catch (IOException ioe) { System.err.println("Error reading file"); }}});

contentPane.add(outputPanel, BorderLayout.SOUTH);

}public static void main(String args[]) {JFrame frame = new Converting();frame.pack();frame.show();}}

注重,该程序没有硬编码任何文件类型,而是询问图像I/O框架支持哪些文件类型。安装Java高级图像处理图像I/O工具RC后,还可以重新运行该程序,你将会看到更多的存储格式。读取其它格式的图像基本上无需改变代码也能工作,用户只要选择不同的文件类型就可以了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有