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

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

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

    風行天下

    JAVA太極
    posts - 4, comments - 10, trackbacks - 0, articles - 55
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

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

    Posted on 2005-03-23 14:40 風太少 閱讀(938) 評論(0)  編輯  收藏

    如果你對圖像處理感興趣,而且需要使用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 format
    String 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后,還可以重新運行該程序,你將會看到更多的存儲格式。讀取其它格式的圖像基本上無需改變代碼也能工作,用戶只要選擇不同的文件類型就可以了。

    注意:圖像I/O庫中的內容比這里說明的要多得多。比方說可以通過寫圖像的參數設置壓縮率,或者用讀寫進度監視器來監聽事件。關于圖像I/O用法的更多信息,請參閱Java Image I/O API Guide

    Java高級圖像處理圖像I/O工具包1.0概覽

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

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

    • 支持對位圖(BMP)編碼解碼(MIME類型image/bmp);
    • 通過本機代碼加速的JPEG的讀寫支持(MIME類型image/jpeg),同時也支持無損JPEG(ISO 10918-1)和JPEG-LS(ISO 14495-1),對支持的所有JPEG變體都能處理12位色深;
    • 支持對JPEG 2000的編碼與解碼(MIME類型image/jpeg2000);
    • 用本機代碼提高對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。前兩個分別以java.nio.channels.FileChannel作為輸入和輸出,最后一個供原始格式解碼器javax.imageio.ImageReader讀取原始數據。同時該工具還支持JAI操作"ImageRead" 和"ImageWrite" ,這兩個操作都包含在包內,分別對應于現有的JAI操作集{"Stream", "FileLoad", "URL"}和{"Encode", "FileStore"}。

    安裝Java高級圖像處理圖像I/O工具包1.0

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

    安裝后除了本機庫之外還有三個JAR文件。如果安全設置禁止使用,這些本機庫就不會發生作用,而回復到僅僅使用內建的純Java版JPG和PNG格式的狀態。

    如果是安裝到Unix機器上,則需要把上述的三個JAR文件安裝到jre/lib/ext目錄下。對于Solaris-SPARC用戶,需要把6個.so文件復制到jre/lib/sparc目錄中。Solaris-x86和Linux用戶應把libclib_jiio.so文件復制到jre/lib/i386中。

    如果要安裝到Microsoft Windows的機器上,同樣需要把三個JAR文件復制到jre\lib\ext目錄中,另外把clib_jiio.dll文件放到jre\bin下。

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

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

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

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

    為了說明已有的代碼仍能工作,首先重新運行一遍前面的GetFormats程序,就可以看到對新的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, ]

    然后運行Converting程序,現在可以把圖像轉換成更多的格式。

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

    結論

    對Java平臺可用的擴展而言,Java高級圖像處理圖像I/O工具包1.0 RC是一個受歡迎的增強。一旦通過RC階段,新增的圖像格式支持將是對標準運行時環境的一個令人鼓舞的改進。庫的內容分別放在幾個com.sun.media.imageio包內,有一些還是本機代碼庫。但是所有庫的使用都通過J2SE 1.4引入的標準圖像I/O框架。只需要把庫添加到JRE中就可以使用它們了。

    資源


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲AV无码一区二区大桥未久| 精品亚洲aⅴ在线观看| 亚洲a级成人片在线观看| 中文字幕日本人妻久久久免费| 亚洲国产精品嫩草影院久久| 亚洲国产AV无码一区二区三区| 性色av免费观看| 亚洲精品国产国语| 处破痛哭A√18成年片免费| 欧洲 亚洲 国产图片综合| 无码人妻一区二区三区免费手机| 亚洲中文无码av永久| 女人18毛片免费观看| 亚洲国产精品成人综合色在线| 色视频色露露永久免费观看| 亚洲av无码专区青青草原| 国产亚洲福利一区二区免费看| 无码 免费 国产在线观看91| 亚洲日本一区二区一本一道| 久久国产精品免费一区| 亚洲av永久无码精品漫画 | 免费无码AV一区二区| 免费成人黄色大片| 精品人妻系列无码人妻免费视频| 久久久久久a亚洲欧洲aⅴ| 最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影 | 国产zzjjzzjj视频全免费| 成人嫩草影院免费观看| 久久精品国产精品亚洲艾草网| 51在线视频免费观看视频| 亚洲欧洲av综合色无码| 亚洲中文无韩国r级电影| 99精品视频在线视频免费观看 | 亚洲狠狠色丁香婷婷综合| 亚洲精品国产电影| 久草福利资源网站免费| 亚洲综合偷自成人网第页色| 免费在线观看一级毛片| 你懂的免费在线观看网站| 亚洲午夜无码久久久久软件| 精品国产亚洲男女在线线电影|