【问题标题】:Java display base 64 byte array in jspJava在jsp中显示base 64字节数组
【发布时间】:2014-08-13 08:38:50
【问题描述】:

我有一个名为 Graphic 的类,它创建一个新的 BufferedImage,绘制一个新的 Graphics2D 并将这个图像作为 base64 编码的字符串返回:

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

// Draw background
g2.setColor(Color.decode("#FFFFFF"));
g2.fillRect(0, 0, grafikBreite, grafikHoehe);
g2.setColor(Color.decode("#000000"));

// Draw some rectangles and other stuff...
drawStuff(g2);

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] imageInByte = {};
try {
  JPEGImageEncoder j = new JPEGImageEncoderImpl(baos);
  j.encode(image);
  imageInByte = baos.toByteArray();
  baos.close();
} catch (IOException e) {
  e.printStackTrace();
}

return javax.xml.bind.DatatypeConverter.printBase64Binary(imageInByte);

在我的 jsp 文件中,我想使用来显示此图像,其中图形是先前创建的 base64 字节数组:

 <img src="data:image/jpg;base64,<c:out value="${graphic}"/>"/>

图片显示出来了,但是问题是图片背景是红色的,其他颜色也有问题。如果我将创建的base64字符串保存为硬盘上的jpeg-File,所有颜色都正确显示。

有人知道为什么 HTML 会以奇怪的颜色显示图像吗?

感谢您的帮助

【问题讨论】:

    标签: java image jsp base64 bufferedimage


    【解决方案1】:

    首先清理一下:

    g2.setColor(Color.WHITE);
    g2.fillRect(0, 0, grafikBreite, grafikHoehe);
    g2.setColor(Color.BLACK);
    drawStuff(g2);
    g2.dispose(); // TODO
    

    在 createGraphics 之后处理。

    然后可以尝试更通用、更便携的 ImageIO 类。抗锯齿等的参数化有点不同,但无论如何 JPEG 是一种有损格式。只是为了尝试不同的角度。

    ImageIO.write(image, "jpg", baos);
    baos.close();
    imageInByte = baos.toByteArray();
    

    然后我先结束了。 (它对 javadoc 没有影响。)

    可以尝试 .png 和另一种类型 ABGR。

    我认为 ImageIO 可以解决问题,或者您的代码使用 ABGR。

    【讨论】:

    • 非常感谢。将图像类型更改为 png 并将 BufferdImage 的类型更改为 TYPE_4BYTE_ABGR 就可以了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2013-03-19
    相关资源
    最近更新 更多