我有一个名为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会以奇怪的颜色显示图像吗?
感谢您的帮助
答案 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。