2014-04-10 40 views
2

這是問題:我有幾個圖像,並希望在JavaFX的WebView中顯示HTML時使用它們。JavaFX2 WebView和內存中的圖像

當前的實現非常明顯:存在一個文件,該文件鏈接到HTML內容中。我假設WebView不會從JEditorPane退步,並且只會執行單個I/O操作,即使圖像在整個內容中被引用10000次。

但是,如果遇到相關的<img>標記,那麼只有一個Image實例並將其提供給WebView會很好。

我已經看到有涉及URL處理大半個解決方案,但問題依然存在:您有轉換爲存儲格式的Image實例(BMP,PNG私有擴展等),並保持在記憶。但是,這意味着每次WebView需要圖像分辨率時,都必須手動從二進制數據解析圖像。最後,您只需將文件映射到內存,再加上內部的Image實例,而不是共享的Image實例。

隨着JEditorPane,你可以推Image s到它的圖像緩存並擺脫這樣的問題。不幸的是,自從Java 7以來,這個組件是不可用的並且沒有問題。

基本上,有沒有機會WebView/WebEngine維護這樣的緩存/等價物,並且是否有預先填充的方法?用法

+0

嗨,哥們,如果你有任何問題的解決方案,因爲不是請與我每股6個月,我需要同樣的事情,你想使用webview,謝謝:) – Muhammad

+1

不幸的是,情況並沒有改變,我的應用程序仍然在文件系統上使用臨時緩存,因爲這種方法適用於任何組件。沒什麼新鮮的。我想除非JFX變得像Swing一樣普遍,否則這就足夠了。 – afk5min

+0

謝謝朋友您的回覆:) – Muhammad

回答

1
/** 
    * Encodes the image as a whole into PNG, then into Base64 and finally into an URI suitable for the HTML {@code <img>} tag. 
    * 
    * @param image an image 
    * @return image as URI (image within the URI) 
    * @throws IIOException if there is a fault with an image writer 
    * @throws IOException in case of a general I/O error 
    */ 
    public static final String getImageSrcForWebEngine(RenderedImage image) throws IIOException, IOException 
    { 
     final ByteArrayOutputStream output = new ByteArrayOutputStream(); 
     ImageIO.write(image, "PNG", output); 
     return "data:base64," + Base64.getMimeEncoder().encodeToString(output.toByteArray()); 
    } 

例子:

RenderedImage image = […]; 
String tag = "<img src=\"" + getImageSrcForWebEngine(image) + "\" border=\"0\" />"; 

SSCCE:

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.awt.image.RenderedImage; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.util.Base64; 

import javax.imageio.IIOException; 
import javax.imageio.ImageIO; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 

public class WebViewWithMemoryImages extends Application 
{ 
    private static String IMAGE_IN_MEMORY; 

    @Override 
    public void start(Stage primaryStage) 
    { 
     WebView webView = new WebView(); 
     webView.getEngine().loadContent("<html><body><img src=\"" + IMAGE_IN_MEMORY + "\"></body></html>"); 
     primaryStage.setScene(new Scene(webView, 420, 420)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) throws Exception 
    { 
     BufferedImage image = new BufferedImage(400, 400, BufferedImage.TYPE_INT_BGR); 
     Graphics2D g = image.createGraphics(); 
     try 
     { 
      g.setColor(Color.RED); 
      g.fillRect(0, 0, 400, 400); 
      g.setColor(Color.WHITE); 
      g.fillRect(50, 50, 300, 300); 
      g.setColor(Color.BLACK); 
      g.fillRect(100, 100, 200, 200); 
      g.drawString("No image files were used in this WebView.", 90, 70); 
     } 
     finally 
     { 
      g.dispose(); 
     } 
     IMAGE_IN_MEMORY = getImageSrcForWebEngine(image); 

     launch(args); 
    } 

    public static String getImageSrcForWebEngine(RenderedImage image) throws IIOException, IOException 
    { 
     final ByteArrayOutputStream output = new ByteArrayOutputStream(); 
     ImageIO.write(image, "PNG", output); 
     return "data:base64," + Base64.getMimeEncoder().encodeToString(output.toByteArray()); 
    } 
}