-1

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

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

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

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

这意味着唯一可行的方法是使用IInputStream. 它是一个接口,因此构造具有该类型的 Object 的唯一方法是使用FileInputStream Reference。这接受一个本地 Java 类RandomAccessFile Reference。这是另一个死胡同,因为它只接受Fileand String

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

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

4

1 回答 1

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

}
于 2016-05-04T19:48:25.493 回答