使用 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 永远不会触及您的磁盘。