将内存中的图像转换为Blob

时间:2014-01-06 23:14:22

标签: java image oracle jax-ws

我在内存中有一个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作为变量传递。

2 个答案:

答案 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的回答看起来更可信)。

  1. 获取BufferedImage(From this answer

    BufferedImage buffered = new BufferedImage(scaleX, scaleY, TYPE);
    buffered.getGraphics().drawImage(image, 0, 0 , null);
    
  2. 获取字节数组(From this answer

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write(buffered, "jpg", baos );
    byte[] imageInByte = baos.toByteArray();
    
  3. 将字节数组保存为blob(From this answer)(但应该使用预备语句)

    Blob blob = connection.createBlob();
    blob.setBytes(1, imageInByte);