熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

高級圖像處理圖像I/O API RC 1.0

2013-11-23 18:59:28  來源: Java核心技術 

  如果你對圖像處理感興趣而且需要使用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(new                  ImageIcon(newImage));             JScrollPane pane = new                  JScrollPane(label);            windowContentadd(pane                 BorderLayoutCENTER);            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後還可以重新運行該程序你將會看到更多的存儲格式讀取其它格式的圖像基本上無需改變代碼也能工作用戶只要選擇不同的文件類型就可以了 From:http://tw.wingwit.com/Article/program/Java/hx/201311/26099.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.