<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    有才華的人,別忘記給滋潤你的那塊土壤施肥

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      28 隨筆 :: 5 文章 :: 147 評(píng)論 :: 0 Trackbacks
    作者:John  Zukowski
    2003年1月

    如果你對(duì)圖像處理感興趣,而且需要使用GIF、JPEG和PNG以外的其它圖像格式,或者希望改善JPEG圖像處理的性能但不知道到哪里尋找適當(dāng)?shù)姆椒ǎ蛘咝枰ㄟ^幾何運(yùn)算(包括非線性變換)來處理圖像,不必再為此苦惱了,答案就在這里——來自Sun公司的Java高級(jí)圖像處理API和JAI圖像I/O  API  1.0  RC。

    JAI  API是Java  Media  API的一部分,與之相伴的還包括Java  2D  API、Java  3D  API、Java  Speech  API和其他一些API。Java高級(jí)圖像處理API是作為Java規(guī)范請(qǐng)求(JSP)34的一部分而開發(fā)的,是對(duì)J2SE  version  1.3+版的擴(kuò)展,主要用于處理圖像。最初發(fā)布的版本是1.0,JDC(Java  Developer  Connection)提供了一個(gè)預(yù)覽版1.1.2  beta。(最新進(jìn)展情況請(qǐng)查閱README.html文件。)與AWT和Java  2D相比,JAI  API提供了更豐富的圖像處理,包括對(duì)許多通用圖像操作的內(nèi)在支持。

    不過本文的目的不是討論JAI  API,而是伴隨這些API但分離到它自己的可安裝庫中的一組圖像讀寫器(codec)類,即Java高級(jí)圖像處理圖像I/O工具1.0  RC。該RC提供了可以插接到J2SE  1.4的圖像I/O框架上的一些功能。作為JSR-15一部分而開發(fā)的圖像I/O  API提供了一個(gè)支持不同圖像格式的可插拔框架。標(biāo)準(zhǔn)J2SE  1.4版本身支持GIF、JPEG和PNG圖像格式,而JAI圖像I/O  RC則提供了更多主流圖像格式的編碼解碼器。只要加上針對(duì)操作平臺(tái)的適當(dāng)版本,以前開發(fā)的應(yīng)用程序就可以處理這些新的圖像格式。

    要理解JAI圖像I/O工具的使用,需要首先了解圖像I/O庫。在安裝和介紹圖像I/O工具包之前,我們先看一看圖像I/O庫。
    圖像I/O庫

    圖像I/O庫是J2SE  1.4的標(biāo)準(zhǔn)API,放在javax.imageio包內(nèi)。雖然這個(gè)包提供了兩個(gè)接口和9個(gè)類,整個(gè)API實(shí)際上就是ImageIO類。通過這個(gè)類可以弄清讀寫所支持的圖像格式并對(duì)這些圖像進(jìn)行讀寫,實(shí)際上這也就是整個(gè)API的全部內(nèi)容。

    由于圖像I/O庫是一個(gè)可插拔的框架,所支持的圖像格式集不是固定不變的。盡管隨J2SE  1.4發(fā)布了一些標(biāo)準(zhǔn)格式,但任何人都可以增加新的支持格式。要查看有哪些格式可用,可以使用下面的代碼:
    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));
           }

    }

    運(yùn)行該程序,你會(huì)發(fā)現(xiàn)這個(gè)庫支持讀取GIF、JPEG和PNG圖像,也支持寫JPEG和PNG圖像,但是不支持寫GIF文件。

    除了與像image/jpeg這樣的MIME類型協(xié)同工作外,ImageIO類還允許通過getReaderFormatNames和  getWriterFormatNames方法使用JPEG這樣的非正式名稱。此外,通過getImageReadersBySuffix和  getImageWritersBySuffix還可以了解是否存在針對(duì)特定文件擴(kuò)展名的reader/writer存在。

    利用ImageIO類,你所要做的事情不過是讀javax.imageio.stream.ImageInputStream、  java.io.InputStream、java.io.File或者java.net.URL,結(jié)果會(huì)得到一個(gè)  java.awt.image.BufferedImage。一旦擁有了BufferedImage,你就可以指定需要的格式名把圖像寫回去。(不僅僅是  BufferImage,任何實(shí)現(xiàn)RenderedImage接口的類都可以寫。)新的格式既可以與讀取的格式相同,也可以是不同的格式以便進(jìn)行格式轉(zhuǎn)換。如果指定的格式?jīng)]有可用的writer,那么write方法就返回false,否則如果找到了相應(yīng)的writer就返回true。
    String  inputFilename  =  ;
    BufferedImage  image  
    =  ImageIO.read(inputFilename);

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

    為了說明圖像I/O庫的用法,下面的例子使用JFileChooser提示輸入圖像文件名。選中文件后再選擇目標(biāo)輸出格式,然后按下“Save(保存)”按鈕。保存完成后,將重新讀取圖像并在一個(gè)新窗口內(nèi)顯示。

    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高級(jí)圖像處理圖像I/O工具RC后,還可以重新運(yùn)行該程序,你將會(huì)看到更多的存儲(chǔ)格式。讀取其它格式的圖像基本上無需改變代碼也能工作,用戶只要選擇不同的文件類型就可以了。

    注意:圖像I/O庫中的內(nèi)容比這里說明的要多得多。比方說可以通過寫圖像的參數(shù)設(shè)置壓縮率,或者用讀寫進(jìn)度監(jiān)視器來監(jiān)聽事件。關(guān)于圖像I/O用法的更多信息,請(qǐng)參閱Java  Image  I/O  API  Guide。
    Java高級(jí)圖像處理圖像I/O工具包1.0概覽

    這就引出了本文要討論的主題,Java高級(jí)圖像處理圖像I/O工具包1.0(RC)。JAI圖像I/O工具主要用于為J2SE1.4的圖像I/O庫提供更多的圖像readers/writers(編碼解碼器codecs)。只要運(yùn)行時(shí)平臺(tái)安裝了該工具,你的程序就能夠支持這些新的編碼解碼器。

    JAI圖像I/O工具提供的新編碼解碼器包括:

           *  支持對(duì)位圖(BMP)編碼解碼(MIME類型image/bmp);
           *  通過本機(jī)代碼加速的JPEG的讀寫支持(MIME類型image/jpeg),同時(shí)也支持無損JPEG(ISO  10918-1)和JPEG-LS(ISO  14495-1),對(duì)支持的所有JPEG變體都能處理12位色深;
           *  支持對(duì)JPEG  2000的編碼與解碼(MIME類型image/jpeg2000);
           *  用本機(jī)代碼提高對(duì)PNG的編碼解碼速度(MIME類型image/png);
           *  可移植位圖(PNM)編碼解碼器支持可移植位圖(PBM)、可移植灰度位圖(PGM)、可移植像素位圖(PPM)(MIME類型分別為image/x-  portable-anymap、image/x-portable-bitmap、image/x-portable-graymap、image/x  -portable-pixmap);
           *  原始格式(無MIME類型);
           *  支持TIFF編碼解碼(MIME類型image/tiff);
           *  支持無線位圖(WBMP)編碼解碼(MIME類型image/vnd.wap.wbmp)。

    該工具庫還使得流插件可以與NIO庫一起使用,詳情參閱com.sun.media.imageio.stream包中的  FileChannelImageInputStream、FileChannelImageOutputStream和  RawImageInputStream。前兩個(gè)分別以java.nio.channels.FileChannel作為輸入和輸出,最后一個(gè)供原始格式解碼器javax.imageio.ImageReader讀取原始數(shù)據(jù)。同時(shí)該工具還支持JAI操作"ImageRead"  和"ImageWrite"  ,這兩個(gè)操作都包含在包內(nèi),分別對(duì)應(yīng)于現(xiàn)有的JAI操作集{"Stream",  "FileLoad",  "URL"}和{"Encode",  "FileStore"}。
    安裝Java高級(jí)圖像處理圖像I/O工具包1.0

    要使用Java高級(jí)圖像處理圖像I/O工具包,首先必須根據(jù)使用的操作系統(tǒng)平臺(tái)從Early  Access  page  for  the  RC下在適當(dāng)?shù)陌姹尽VС值牟僮飨到y(tǒng)有Solaris  SPARC、Solaris  x86、Linux和Windows,大小也隨著版本而異,  Solaris  SPARC版有5MB之多,而其他版本則只有1MB左右。下載頁面的README-jai_imageio.html文件提供了有關(guān)的下載信息和安裝說明,同時(shí)還給出了所支持的編碼解碼插件的版本信息,比如BMP的編碼解碼器可以讀取版本號(hào)從3到5的圖像,但是只能寫版本號(hào)3的圖像。

    安裝后除了本機(jī)庫之外還有三個(gè)JAR文件。如果安全設(shè)置禁止使用,這些本機(jī)庫就不會(huì)發(fā)生作用,而回復(fù)到僅僅使用內(nèi)建的純Java版JPG和PNG格式的狀態(tài)。

    如果是安裝到Unix機(jī)器上,則需要把上述的三個(gè)JAR文件安裝到j(luò)re/lib/ext目錄下。對(duì)于Solaris-SPARC用戶,需要把6個(gè).so文件復(fù)制到j(luò)re/lib/sparc目錄中。Solaris-x86和Linux用戶應(yīng)把libclib_jiio.so文件復(fù)制到  jre/lib/i386中。

    如果要安裝到Microsoft  Windows的機(jī)器上,同樣需要把三個(gè)JAR文件復(fù)制到j(luò)re\lib\ext目錄中,另外把clib_jiio.dll文件放到j(luò)re\bin下。

    注意:上述目錄都是相對(duì)于JRE的根目錄而言的。

    只要把這些文件放到了規(guī)定的位置,JAI圖像I/O工具包就安裝完成了。

    Java高級(jí)圖像處理圖像I/O工具包1.0的用法

    安裝Java高級(jí)圖像處理圖像I/O工具包并不改變圖像I/O庫的用法。正確編寫的代碼無需變更也能正常運(yùn)行。可能唯一需要改變的就是新的圖像格式使用何種擴(kuò)展名,你可以使用getWriterFormatNames之類的函數(shù)所返回的名稱,也可以對(duì)各種格式進(jìn)行硬編碼。

    為了說明已有的代碼仍能工作,首先重新運(yùn)行一遍前面的GetFormats程序,就可以看到對(duì)新的MIME類型的支持:

    Readers:  [image/png,  image/x-portable-graymap,  
       mage/jpeg,  image/jpeg2000,  image/x-png,  
       mage/tiff,  image/vnd.wap.wbmp,  image/x-portable-pixmap,  
       mage/x-portable-bitmap,  image/bmp,  image/gif,  
       mage/x-portable-anymap,  ]
    Writers:  [image/png,  image/x-portable-graymap,  image/jpeg,  
       mage/jpeg2000,  image/x-png,  image/tiff,  
       mage/vnd.wap.wbmp,  image/x-portable-pixmap,  
       mage/x-portable-bitmap,  image/bmp,  
       mage/x-portable-anymap,  ]

    然后運(yùn)行Converting程序,現(xiàn)在可以把圖像轉(zhuǎn)換成更多的格式。

    盡管對(duì)于默認(rèn)的編碼解碼器而言,那些缺省的讀寫設(shè)置通常已經(jīng)足夠了,但是也許你希望改變新增編碼解碼器的設(shè)置。改變這些設(shè)置無需調(diào)用ImageIO的  read和write方法,而只要針對(duì)指定的MIME類型從ImageIO獲得相應(yīng)的ImageReader或ImageWriter對(duì)象,然后改變這些對(duì)象的設(shè)置就可以了。一旦改變了默認(rèn)的ImageReadParam或者ImageWriteParam,就可以返回去調(diào)用ImageIO的read和  Write方法。否則的話,就只能在ImageReader和ImageWriter中進(jìn)行讀寫操作。比如,JPEG的ImageWriter會(huì)要求你通知編碼器生成優(yōu)化的圖像Huffman表。其它的編碼解碼器也會(huì)提供它們自己的相應(yīng)設(shè)置。
    結(jié)論

    對(duì)Java  平臺(tái)可用的擴(kuò)展而言,Java高級(jí)圖像處理圖像I/O工具包1.0  RC是一個(gè)受歡迎的增強(qiáng)。一旦通過RC階段,新增的圖像格式支持將是對(duì)標(biāo)準(zhǔn)運(yùn)行時(shí)環(huán)境的一個(gè)令人鼓舞的改進(jìn)。庫的內(nèi)容分別放在幾個(gè)  com.sun.media.imageio包內(nèi),有一些還是本機(jī)代碼庫。但是所有庫的使用都通過J2SE  1.4引入的標(biāo)準(zhǔn)圖像I/O框架。只需要把庫添加到JRE中就可以使用它們了。
    資源

           *  Java  Media  APIs
           *  Java  Advanced  Imaging  API
           *  Java  Advanced  Imaging  Image  I/O  API  RC  1.0
           *  Java  Advanced  Imaging  Image  I/O  Tools  API  Documentation
           *  JSR  15:  Image  I/O  Framework  Specification
           *  JSR  34:  Java  Advanced  Imaging  API  1.1
           *  Java  Advanced  Imaging  Interest  Group
           *  Java  Image  I/O  API  Guide
    posted on 2010-01-08 14:09 kissjava 閱讀(523) 評(píng)論(0)  編輯  收藏 所屬分類: java基礎(chǔ)

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 久久精品视频免费看| 国产成人自产拍免费视频| 亚洲国产欧美国产综合一区 | 无码AV片在线观看免费| 久久精品国产亚洲7777| AAAAA级少妇高潮大片免费看| 91香焦国产线观看看免费| 亚洲av无码乱码国产精品| 极品色天使在线婷婷天堂亚洲| 成年女人毛片免费视频| 亚洲午夜无码久久久久软件| 外国成人网在线观看免费视频| 亚洲AV无码乱码在线观看裸奔| 免费国产99久久久香蕉| 亚洲色偷偷av男人的天堂| 免费一级毛片在线播放放视频 | 亚洲VA中文字幕不卡无码| 精品国产污污免费网站入口在线| 国产gv天堂亚洲国产gv刚刚碰 | 免费人成又黄又爽的视频在线电影| mm1313亚洲精品无码又大又粗 | 亚洲成在人线aⅴ免费毛片| www.亚洲色图.com| 国产日韩久久免费影院| 亚洲av日韩av高潮潮喷无码| 国产精品亚洲а∨无码播放麻豆 | 永久久久免费浮力影院| 男女猛烈无遮掩视频免费软件| 久久精品亚洲乱码伦伦中文| 亚洲a一级免费视频| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲精品无码专区久久久| 九九精品国产亚洲AV日韩| 亚洲日本中文字幕一区二区三区 | 中文字幕成人免费高清在线| 久久久久亚洲精品天堂| 在线免费不卡视频| 亚洲一区在线视频| 免费观看国产网址你懂的| 亚洲理论片在线中文字幕| 免费人成年轻人电影|