将 javax.swing.ImageIcon 对象转换为 org.pdfclown.documents.contents.entities.Image

casting an javax.swing.ImageIcon object to org.pdfclown.documents.contents.entities.Image

我正在尝试将 javax.swing.ImageIcon 转换为 org.pdfclown.documents.contents.entities.Image,以便我可以显示 PDF Clown 从我的 Swing 应用程序创建的 PDF 文件中的图像。

我需要一个 ImageIcon,因为源图像需要可序列化,以便我可以将我的图像存储为序列化文件,作为更大、更复杂的数据模型的一部分。

当我查看 API for PDF Clown 时,我注意到 Image 接受 3 个输入;

  1. String 路径。 - 无法工作,因为 ImageIcon 没有路径。
  2. File。 - 无法工作,因为磁盘上不存在 ImageIcon
  3. IInputStreamReference

这意味着唯一可行的方法是使用 IInputStream。它是一个接口,因此构造具有该类型的对象的唯一方法是使用 FileInputStream Reference. This accepts a native Java class of RandomAccessFile Reference。这是另一个死胡同,因为它只接受 FileString.

解决方案必须是将 ImageIcon 作为图像写入磁盘,然后再读回。我对此担心的是,我需要在输出之前使用路径来存储图像,用户不会限制访问。

我可以在不先写入磁盘的情况下执行此操作吗?

我创建这个 class 来执行转换;

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;
    }

}