Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将javax.swing.ImageIcon对象强制转换为org.pdfclown.documents.contents.entities.Image_Java_Image_Swing_Pdf_Pdfclown - Fatal编程技术网

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

将javax.swing.ImageIcon对象强制转换为org.pdfclown.documents.contents.entities.Image,java,image,swing,pdf,pdfclown,Java,Image,Swing,Pdf,Pdfclown,我正试图将javax.swing.ImageIcon转换为org.pdfclown.documents.contents.entities.Image,这样我就可以在我的swing应用程序中由PDF小丑创建的PDF文件中显示图像 我需要一个ImageIcon,因为源图像需要可序列化,以便我可以将图像作为序列化文件存储为更大、更复杂的数据模型的一部分 当我查看图像时,我注意到图像接受3个输入 字符串路径。-无法工作,因为ImageIcon没有路径 文件-无法工作,因为磁盘上不存在ImageIcon

我正试图将
javax.swing.ImageIcon
转换为
org.pdfclown.documents.contents.entities.Image
,这样我就可以在我的swing应用程序中由PDF小丑创建的PDF文件中显示图像

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

当我查看图像时,我注意到
图像
接受3个输入

  • 字符串
    路径。-无法工作,因为
    ImageIcon
    没有路径
  • 文件
    -无法工作,因为磁盘上不存在
    ImageIcon
  • IInputStream
    stream
  • 这意味着唯一可行的方法是使用
    IInputStream
    。它是一个接口,因此构造该类型对象的唯一方法是使用
    FileInputStream
    。它接受本机Java类
    RandomAccessFile
    。这是另一个死胡同,因为它只接受
    文件
    字符串

    然后,解决方案必须是将
    图像图标
    作为图像写入磁盘,然后将其读回。我关心的是,我需要使用一个路径来存储输出前的图像,用户将不会限制访问


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

    我创建了这个类来执行强制转换

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

    我不熟悉那个API,但它看起来像是
    Buffer
    实现了
    IInputStream
    ,并接受了更灵活的构造函数参数。