gpt4 book ai didi

JavaFX2 WebView 和内存图像

转载 作者:行者123 更新时间:2023-11-30 09:09:35 24 4
gpt4 key购买 nike

这里是问题所在:我有几张图片,想在 JavaFX 的 WebView 中显示 HTML 时使用它们.

当前的实现非常明显:有一个文件,链接到 HTML 内容中。我假设 WebView不会从 JEditorPane 倒退即使图像在整个内容中被引用 10 000 次,也只会执行一次 I/O 操作。

但是,如果有一个 Image 就好了实例并在遇到相关的<img>时将其提供给WebView标签。

我看到有一个很棒的半解涉及 URL处理,但问题仍然存在:你有一个 Image例如,您将其转换为存储格式(BMP、具有专有扩展名的 PNG 等)并将其保存在内存中。然而,这意味着每次 WebView 需要图像分辨率时,它必须手动从二进制数据中解析图像。最后,您只有一个映射到内存的文件加上一个内部 Image。实例而不是共享 Image实例。

JEditorPane , 你可以推 Image s到它的图像缓存并摆脱此类问题。不幸的是,从 Java 7 开始,该组件就无法使用并且是不可能的。

基本上,有没有机会WebView/WebEngine维护这样一个缓存/等价物,有没有办法预先填充它?

最佳答案

    /**
* 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\" />";

中南合作:

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

关于JavaFX2 WebView 和内存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22984430/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com