2016-05-03 113 views
-1

我試圖將javax.swing.ImageIcon投射到org.pdfclown.documents.contents.entities.Image,以便我可以在我的Swing中顯示由PDF Clown創建的PDF文件中的圖像應用。將javax.swing.ImageIcon對象投射到org.pdfclown.documents.contents.entities.Image

我需要ImageIcon,因爲源圖像需要可序列化,以便我可以將圖像作爲序列化文件存儲,作爲更大,更復雜的數據模型的一部分。

當我看API for PDF Clown我注意到Image接受3輸入;

  1. String path。 - 不會工作,因爲ImageIcon沒有路徑。
  2. File。 - 不能工作,因爲ImageIcon在磁盤上不存在。
  3. IInputStreamReference

這意味着唯一可行的方法是使用一個IInputStream。它是一個接口,因此構建該類型對象的唯一方法是使用FileInputStreamReference。這接受一個本地Java類RandomAccessFileReference。這是另一個死衚衕,因爲它只接受FileString

解決方案必須將ImageIcon作爲映像寫入磁盤,然後再讀回。我對此的擔憂是,我需要使用路徑來存儲輸出之前的圖像,用戶不會限制訪問權限。

我可以在不首先寫入磁盤的情況下執行此操作嗎?

+3

我對這個API並不熟悉,但它看起來像'Buffer'實現了'IInputStream',並且接受了更靈活的構造函數參數。 – resueman

回答

1

我創建了這個類來執行演員;

public class ImageIconToBuffer { 
    public static Buffer convert(ImageIcon img) { 
     try { 
      BufferedImage image = toBufferedImage(img); 

      byte[] bytes = toByteArray(image); 

      Buffer buffer = new Buffer(bytes); 
      return buffer; 
     } catch (IOException e) { 
      return null; 
     } 
    } 

    public static byte[] toByteArray(BufferedImage image) throws IOException { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream();    
     JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(baos); 
     encoder.encode(image); 

     return baos.toByteArray(); 
    } 

    public static BufferedImage toBufferedImage(ImageIcon icon) { 
     Image img = icon.getImage(); 
     BufferedImage bi = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_RGB); 

     Graphics2D bGr = bi.createGraphics(); 
     bGr.drawImage(img, 0, 0, null); 
     bGr.dispose(); 

     return bi; 
    } 

}