在Java中将java.awt.Image保存到磁盘

7
我已经通过以下代码从Oracle过程中读取了CLOB,并将其转换为java.awt.Image对象。
InputStream stream = clob.getAsciiStream();
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                int a1 = stream.read();
                while (a1 >= 0) {
                  output.write((char) a1);
                  a1 = stream.read();
                }
                Image myImage = Toolkit.getDefaultToolkit().createImage(output.toByteArray());
                output.close();

现在,我想把myImage保存到硬盘上。那么,我该怎么做才能将这些java.awt.Image保存到文件中呢?
我的尝试:
我已经将myImage转换为BufferedImage,然后通过以下代码将其写入ImageIo:
BufferedImage bi = (BufferedImage)myImage;
               ImageIO.write(bi, "jpg",new File("E:\\out.jpg"));

但是我遇到了以下异常:
Got Exception as : sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage
java.lang.ClassCastException: sun.awt.image.ToolkitImage cannot be cast to java.awt.image.BufferedImage
    at com.connect.home.Home.getHomeParameter(Home.java:103)
    at com.connect.home.Home.main(Home.java:141)

我该如何解决这个错误?任何建议都非常有帮助。


尝试这个:http://stackoverflow.com/questions/22426040/error-sun-awt-image-toolkitimage-cannot-be-cast-to-java-awt-image-bufferedimage - PLP
抛出异常:宽度(-1)和高度(-1)不能<= 0 java.lang.IllegalArgumentException: 宽度(-1)和高度(-1)不能<= 0 - user5617522
使用ImageIO.write方法。 - Gilbert Le Blanc
无论您将myImage强制转换为ImageBufferedImage,它在运行时始终保持为ToolkitImage。将子类强制转换为超类(从TookitImageImage)总是可行的。但是,即使它们共享相同的超类,也不一定能将其强制转换为其他某些类(如BufferedImage)。 - Alex
1
@AlexanderOrlov “然而,将其转换为其他类并不总是可能的。” 这里不需要“总是”,因为你永远无法进行这样的转换。只能将其转换为相同的类或父类。 TookitImageBufferedImage 是兄弟(同一父类),这种转换是行不通的。 - Tom
显示剩余2条评论
1个回答

4

首先

Oracle JDBC驱动程序支持在服务器和客户端之间以任一方向操纵数据流。驱动程序支持所有流转换:二进制、ASCII和Unicode。以下是每种类型的流的简要描述:

二进制。用于原始数据字节,对应于getBinaryStream方法

ASCII。用于ISO-Latin-1编码中的ASCII字节,对应于getAsciiStream方法

Unicode。用于UTF-16编码的Unicode字节,对应于getUnicodeStream方法

因此,您可能需要使用clob.getBinaryStream来检索流。

其次。您无法使用ImageIO::write保存ToolKitImage,因为它期望一个RenderedImage实例,而ToolkitImage没有实现这个接口。

因此,您有两个选择。

使用ImageIO读取流

    RenderedImage image = ImageIO.read(clob.getBinaryStream());
    ImageIO.write(image, "JPG",new File("E:\\out.jpg"));

或者在 RenderedImage 上绘制 ToolkitImage

    BufferedImage bi = new BufferedImage(myImage.getWidth(null), myImage.getHeight(null), BufferedImage.TYPE_INT_RGB);
    bi.getGraphics().drawImage(myImage,0,0, null);
    ImageIO.write(bi, "JPG", new File("E:\\out.jpg"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接