网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.Java常用的加密 解密 数字签名等.
.按要求进行决定是否有状态的EJB(.
.Java 1.5 中新的静态导入特性.
.Resin服务器下的中文乱码解决方案.
.Java无线开发教程之一.
.在Eclipse RCP中实现控制反转(Io.
.PL/SQL中应该如何使用Array.
.创建通过 WDO访问数据的 JSF 应用.
.GEF-SDK-3.0.1.
.开发线程安全的SpringWeb应用.
.JAVA学习经验之谈.
.你好,wiki.
.DHCP(动态主机配置协议)基本信.
.J2EE指南.
.DudoJ框架——最初的设想.
.sort 方法.
.在S1AS7中配置MySQL(支持CMP).
.SQRT1_2 属性.
.有效地对软件进行交互式诊断的技.
.Java单体测试工具cactus使用指南.

高级图像处理图像I/O API RC 1.0

发表日期:2008-1-5



  假如你对图像处理感爱好,而且需要使用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(new                  ImageIcon(newImage));             JScrollPane pane = new                  JScrollPane(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后,还可以重新运行该程序,你将会看到更多的存储格式。读取其它格式的图像基本上无需改变代码也能工作,用户只要选择不同的文件类型就可以了。
上一篇:开发基于JNDI的应用程序 人气:680
下一篇:面向对象思想之 -- 理解类和对象 人气:950
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐