在Java应用程序中,我在对话框中使用webview在HTML报告中显示带有图像的文本。
图像是饼图,以下函数将图表转换为bufferedimage:
protected static BufferedImage draw(JFreeChart chart, int width, int height)
{
BufferedImage img = new BufferedImage(width , height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = img.createGraphics();
chart.draw(g2, new Rectangle2D.Double(0, 0, width, height));
g2.dispose();
return img;
}
我需要通过将图片标记的src设置为此图片,在HTML内容中显示此图片:
.. <img src='" + draw(..) +"' alt=\"\" height=\"230\" width=\"390\">..
我无法提取该缓冲图片的路径..
在以这种方式进行之前,我尝试将图像保存在系统中,然后在图像标记中设置其路径,但问题是,当处理事件并导出图像时,它出现在第一个报告中时间,在第二次事件handeled和图像导出报告显示旧图像! 这是导出图像时使用的功能:
public static void saveToFile(JFreeChart chart, String aFileName, int width, int height, double quality) throws FileNotFoundException, IOException {
BufferedImage img = draw( chart, width, height );
FileOutputStream fos = new FileOutputStream(aFileName);
JPEGImageEncoder encoder2 =
JPEGCodec.createJPEGEncoder(fos);
JPEGEncodeParam param2 =
encoder2.getDefaultJPEGEncodeParam(img);
param2.setQuality((float) quality, true);
encoder2.encode(img,param2);
fos.close();
}
答案 0 :(得分:2)
您可以使用ImageIO.write()
将图像写入文件,然后像这样检索byte[]
:
ImageIO.write(bufferedImage,"png",new File("tmpImage.png"));
byte[] imageBytes = Files.readAllBytes(Paths.get("tmpImage.png"));
然后使用Base64.Encoder
,您可以将图像转换为可以传递给html的base64字符串。看看这个:
Base64.Encoder encoder = Base64.getEncoder();
String encoding = "data:image/png;base64," + encoder.encodeToString(imageBytes);
<img src='" + encoding +"' alt=\"\" height=\"230\" width=\"390\">.
您必须在实际编码之前添加data:image/png;base64,
String
。这告诉浏览器它正在查看哪种数据
因此,在draw()
方法中,您只需返回BufferedImage
,而不是返回String
。 Base64非常适合这种类型的东西,但确实有它的垮台。存储base64图像时,它们比实际图像对象略重。幸运的是,通过这种实现,base64永远不会碰到你的磁盘。