2016-05-03 9 views
-1

org.pdfclown.documents.contents.entities.Imageにキャストしようとしています。私は、SwingのPDFから作成したPDFファイルで画像を表示できます。応用。javax.swing.ImageIconオブジェクトをorg.pdfclown.documents.contents.entities.Imageにキャストする

ImageIconを必要とするのは、ソースイメージをシリアライズ可能にする必要があるため、画像をより大きな、より複雑なデータモデルの一部としてシリアライズされたファイルとして保存できるからです。

API for PDF Clownを見ると、Imageは3つの入力を受け付けます。

  1. Stringパス。 - ImageIconにはパスがないため、機能しません。
  2. File。 - ImageIconがディスクに存在しないため、動作しません。
  3. IInputStreamストリームReference

これが唯一の現実的な方法が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; 
    } 

} 
関連する問題