小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

java圖像處理 - Daemon

 ShangShujie 2007-06-05
如果你對圖像處理感興趣,而且需要使用GIF、JPEG和PNG以外的其它圖像格式,或者希望改善JPEG圖像處理的性能但不知道到哪里尋找適當(dāng)?shù)姆椒ǎ? 或者需要通過幾何運(yùn)算(包括非線性變換)來處理圖像,不必再為此苦惱了,答案就在這里——來自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規(guī)范請求(JSP)34的一部分而開發(fā)的,是對J2SE version 1.3+版的擴(kuò)展,主要用于處理圖像。最初發(fā)布的版本是1.0,JDC(Java Developer Connection)提供了一個(gè)預(yù)覽版1.1.2 beta。(最新進(jìn)展情況請查閱README.html文件。)與AWT和Java 2D相比,JAI API提供了更豐富的圖像處理,包括對許多通用圖像操作的內(nèi)在支持。

不過本文的目的不是討論JAI API,而是伴隨這些API但分離到它自己的可安裝庫中的一組圖像讀寫器(codec)類,即Java高級圖像處理圖像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則提供了更多主流圖像格式的編碼解碼器。只要加上針對操作平臺的適當(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è)類可以弄清讀寫所支持的圖像格式并對這些圖像進(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)行該程序,你會發(fā)現(xiàn)這個(gè)庫支持讀取GIF、JPEG和PNG圖像,也支持寫JPEG和PNG圖像,但是不支持寫GIF文件。

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

利用 ImageIO類,你所要做的事情不過是讀javax.imageio.stream.ImageInputStream、 java.io.InputStream、java.io.File或者java.net.URL,結(jié)果會得到一個(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高級圖像處理圖像I/O工具RC后,還可以重新運(yùn)行該程序,你將會看到更多的存儲格式。讀取其它格式的圖像基本上無需改變代碼也能工作,用戶只要選擇不同的文件類型就可以了。

注意:圖像I/O庫中的內(nèi)容比這里說明的要多得多。比方說可以通過寫圖像的參數(shù)設(shè)置壓縮率,或者用讀寫進(jìn)度監(jiān)視器來監(jiān)聽事件。關(guān)于圖像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)。只要運(yùn)行時(shí)平臺安裝了該工具,你的程序就能夠支持這些新的編碼解碼器。

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

  • 支持對位圖(BMP)編碼解碼(MIME類型image/bmp);
  • 通過本機(jī)代碼加速的JPEG的讀寫支持(MIME類型image/jpeg),同時(shí)也支持無損JPEG(ISO 10918-1)和JPEG-LS(ISO 14495-1),對支持的所有JPEG變體都能處理12位色深;
  • 支持對JPEG 2000的編碼與解碼(MIME類型image/jpeg2000);
  • 用本機(jī)代碼提高對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),分別對應(yīng)于現(xiàn)有的JAI操作集{"Stream", "FileLoad", "URL"}和{"Encode", "FileStore"}。

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

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

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

如 果是安裝到Unix機(jī)器上,則需要把上述的三個(gè)JAR文件安裝到j(luò)re/lib/ext目錄下。對于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下。

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

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

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

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

為了說明已有的代碼仍能工作,首先重新運(yùn)行一遍前面的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, ]

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

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

結(jié)論

對Java平臺可用的 擴(kuò)展而言,Java高級圖像處理圖像I/O工具包1.0 RC是一個(gè)受歡迎的增強(qiáng)。一旦通過RC階段,新增的圖像格式支持將是對標(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中就可以使用它們了。

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1634989


[收藏到我的網(wǎng)摘]   Daemon_neu發(fā)表于 2007年06月02日 08:04:55

相關(guān)文章:

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多