Java显示基础在jsp中的64字节数组

时间:2014-06-23 10:29:00

标签: java image jsp base64 bufferedimage

我有一个名为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-File中,我想使用display来显示这个图像,其中graphic是先前创建的base64字节数组:

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

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

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

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

先清理一下:

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。