使用bufferedimage java

时间:2017-05-01 10:43:50

标签: java html image bufferedimage

在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();

    }

1 个答案:

答案 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永远不会碰到你的磁盘。