【问题标题】:Byte[] to BufferedImage in javaByte[] 到 Java 中的 BufferedImage
【发布时间】:2015-02-16 19:18:57
【问题描述】:

我在显示数据库中的图片时遇到问题,数据库将图片保存在 blob 中,当我拾取 blob 传递给 Byte[] 的数据时,之后我这样做是为了显示图像,为什么没有工作吗?

Select_1 xp = new Select_1();
byte[] img=xp.Select_1(username);
InputStream in = new ByteArrayInputStream(img);
BufferedImage image = ImageIO.read(in);
BufferedImage resizedImage=resize(image,204,204);
ImageIcon icon=new ImageIcon(resizedImage);
lblavatar.setIcon(icon);

根据注释编辑:

最初,图像是使用以下方法编写的:

blob = (Blob) connect.createBlob(); 
ImageIcon ii = new ImageIcon(ficheiro); 
ObjectOutputStream oos; 
oos = new ObjectOutputStream(blob.setBinaryStream(1));
oos.writeObject(ii);  
oos.close(); 
psInsert.setBlob(4, blob);

【问题讨论】:

  • 你在标题中写了“BufferedReader”,但是你的代码没有BufferedReader。你说“我有问题”,但你没有告诉我们哪个是(错误消息、异常、意外结果)。你的前两行代码令人费解(xp.Select_1 到底是什么??)你不要告诉我们第一行 image 是否被检索到。这些只是您的问题缺乏质量的部分原因。
  • 任何错误信息,异常?数据库blob保存什么样的图像格式
  • 对不起是 BufferedImage。问题是不检索任何错误......并且图像被检索(我认为)我将 blob 从数据库拉到字节 [] byte[] img= resultSet.getBytes("avatar"); 的方式是错误的吗?
  • 原图是如何转成blob的?

标签: java


【解决方案1】:

您不是在序列化一个BufferedImage,而是一个ImageIcon

为了从 blob 数据创建图像,您必须执行与创建 blob 所做的“相反”的操作。在这种情况下,您必须按照以下方式做一些事情

byte[] img=xp.Select_1(username);
InputStream in = new ByteArrayInputStream(img);
ObjectInputStream ois = new ObjectInputStream(in);
ImageIcon imageIcon = (ImageIcon)ois.readObject();

现在,您有一个ImageIcon,您可以从中获取Image。在许多情况下,可以直接使用此图像。如果你真的需要BufferedImage,那么你可以这样做

BufferedImage bi = new BufferedImage(204,204,BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.createGraphics();
g.drawImage(imageIcon.getImage(), 0, 0, 204, 204, null);
g.dispose();

然后缓冲图像将包含您的图像(在本例中已缩放到所需的目标大小 204,204)。

在任何情况下,您都应该考虑将图像存储为序列化的ImageIcon。相反,您应该将图像作为 PNG 或 JPG 文件写入字节数组,并将生成的字节数组作为 blob 存储在数据库中,例如,Java: BufferedImage to byte array and back 中所示

【讨论】:

  • 写原图最好通过ImageIO.write
  • @MadProgrammer 这就是我在上一段中所说的。我什至在那里使用了 bold 字体! :-o
  • @MadProgrammer 这很难。如果有人问“我怎么能射我的脚?”,说“你不应该这样做”可以被认为是“不是答案”。在这种情况下,甚至不清楚询问者是否可以(仍然)影响存储在 blob 中的数据的格式。我希望 bold 字体和链接(以及这些 cmets)将引导他(和其他所有人)朝着正确的方向前进(如果他们有选择的话)
猜你喜欢
  • 2022-01-18
  • 2012-11-30
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 2011-07-27
  • 1970-01-01
  • 2011-05-20
相关资源
最近更新 更多