我在内存中有一个Image(类型:java.awt.Image),我想使用jdk 1.7将它转换为Blob(类型:java.sql.Blob)。
我在这个主题上找到的所有东西都使用了流和文件。当然,我不需要将此Image保存到文件中才能转换它?
这里没什么可说明的,但下面是一个例子:
import java.sql.Blob; import java.awt.Image;
public GenericResponseType savePhoto(Image image)
{
Connection conn = ds.getConnection();
<< some DB code and assembly of PreparedStatement >>
Blob blob = conn.createBlob();
<< here's where the magic needs to happen I need to get the image parameter to blob >>
// I've tried the following but doesn't quite work as it wants a RenderedImage
// OutputStream os = blob.setBinaryStream(1);
// ImageIO.write(parameters.getPhoto().getImage(), "jpg", os);
pstmt.setBlob(4, blob);
}
更多细节(尽管我怀疑它很重要)是上面是使用来自WSDL的Web服务/ JAX-WS生成的,其中使用MTOM声明了一个操作。因此它生成一个签名,其中Image作为变量传递。
答案 0 :(得分:2)
java.awt.Image
非常简单。它没有提供任何可以写入/保存图像的方法,也没有提供任何方法来访问图像的基础像素数据。
第一步是将java.awt.Image
转换为ImageIO
可以支持的内容。这将允许您将图像数据写出来......
ImageIO
需要RenderedImage
作为主要图片来源。 BufferedImage
是默认库中此接口的唯一实现...
不幸的是,没有简单的方法可以从一个转换为另一个。幸运的是,这并不难。
Image img = ...;
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = bi.createGraphics();
g2d.drawImage(img, 0, 0, null);
g2d.dispose();
基本上,这只会将原始java.awt.Image
绘制到BufferedImage
接下来,我们需要以某种方式保存图像,以便它可以生成InputStream
...
这不是最优的,但可以完成工作。
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
ImageIO.write(bi, "png", baos);
} finally {
try {
baos.close();
} catch (Exception e) {
}
}
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
基本上,我们将图片写入ByteArrayOutputStream
并使用结果生成ByteArrayInputStream
现在。如果内存存在问题或图像相当大,您可以先将图像写入File
,然后通过某种File
简单地读取InputStream
...
最后,我们将InputStream
设置为所需的列...
PreparedStatement stmt = null;
//...
stmt.setBlob(parameterIndex, bais);
布洛克是你的叔叔......
答案 1 :(得分:0)
尝试以下方法:(可能是一个更简单的过程,这就是我在快速进行后发现的并且无法保证它能够正常工作 - Mads的回答看起来更可信)。
获取BufferedImage(From this answer)
BufferedImage buffered = new BufferedImage(scaleX, scaleY, TYPE);
buffered.getGraphics().drawImage(image, 0, 0 , null);
获取字节数组(From this answer)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(buffered, "jpg", baos );
byte[] imageInByte = baos.toByteArray();
将字节数组保存为blob(From this answer)(但应该使用预备语句)
Blob blob = connection.createBlob();
blob.setBytes(1, imageInByte);