2017-05-01 49 views
1

在Java應用程序,我展示在使用對話框中的WebView的HTML報告的圖像文本..組圖片src使用的BufferedImage的Java

的圖像是一個餅圖,下面的函數的圖表轉換一個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; 
} 

我需要在一個HTML內容通過圖像標籤的設置src到該圖像顯示此圖像:

.. <img src='" + draw(..) +"' alt=\"\" height=\"230\" width=\"390\">.. 

,我不能提取該BUFF的路徑ered image ..

在這樣做之前,我試着將圖像保存在系統中,然後在圖像標籤中設置它的路徑,但問題是,當事件被處理並且圖像被導出時,它出現在第一次報道,第二次報道和圖像輸出報告顯示舊圖像! 這是一個已經在導出圖像中使用的功能:

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

    } 

回答

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永遠不會碰到你的磁盤。

+0

出現錯誤:java.awt.image.DataBufferInt不能轉換爲java.awt.image.DataBufferByte –

+0

@MIBMinion你可以在短時間內將圖像寫入磁盤嗎? – CraigR8806

+0

是的..檢查我的問題的最後一節 –