使用 bufferedimage java 设置图像 src
set image src using bufferedimage java
在 Java 应用程序中,我在 HTML 报告中使用对话框中的 webview 显示带有图像的文本..
图像是饼图,以下函数将图表转换为缓冲图像:
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\">..
而且我无法提取该缓冲图像的路径..
在这种方式之前,我尝试将图像保存在系统中,然后在图像标签中设置其路径,但问题是,当处理事件并导出图像时,它出现在报告中第一次,第二次事件处理和导出报告的图像显示旧图像!
这是导出图片时用到的函数:
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();
}
您可以使用 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()
方法中,您只需要 return 一个 String
,而不是 return 一个 BufferedImage
。 Base64 对这类事情非常方便,但也有缺点。存储 base64 图像时,它们比实际图像对应物稍重。幸运的是,有了这个实现,base64 永远不会触及您的磁盘。
在 Java 应用程序中,我在 HTML 报告中使用对话框中的 webview 显示带有图像的文本..
图像是饼图,以下函数将图表转换为缓冲图像:
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\">..
而且我无法提取该缓冲图像的路径..
在这种方式之前,我尝试将图像保存在系统中,然后在图像标签中设置其路径,但问题是,当处理事件并导出图像时,它出现在报告中第一次,第二次事件处理和导出报告的图像显示旧图像! 这是导出图片时用到的函数:
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();
}
您可以使用 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()
方法中,您只需要 return 一个 String
,而不是 return 一个 BufferedImage
。 Base64 对这类事情非常方便,但也有缺点。存储 base64 图像时,它们比实际图像对应物稍重。幸运的是,有了这个实现,base64 永远不会触及您的磁盘。