Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX2 WebView和内存中图像_Java_Image_Webview_Javafx - Fatal编程技术网

JavaFX2 WebView和内存中图像

JavaFX2 WebView和内存中图像,java,image,webview,javafx,Java,Image,Webview,Javafx,问题是:我有几个图像,希望在JavaFX的WebView中显示HTML时使用它们 当前的实现非常明显:在HTML内容中有一个链接到的文件。我假设WebView不会从JEditorPane回归,即使图像在整个内容中被引用10000次,也只会执行一次I/O操作 但是,如果有一个图像实例,并在遇到相关的标记时将其提供给WebView,那就太好了 我已经看到了一个涉及URL处理的很好的半解决方案,但问题仍然存在:您有一个Image实例,可以将其转换为存储格式(BMP、带有专有扩展名的PNG等),并将其保

问题是:我有几个图像,希望在JavaFX的
WebView
中显示HTML时使用它们

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

但是,如果有一个
图像
实例,并在遇到相关的
标记时将其提供给WebView,那就太好了

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

使用
JEditorPane
,您可以将
图像
推送到它的图像缓存中,并消除此类问题。不幸的是,由于Java7,该组件无法使用,因此不存在问题

基本上,是否有机会
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());
    }
*将图像整体编码为PNG,然后编码为Base64,最后编码为适合HTML{@code的URI 用法示例:

RenderedImage image = […];
String tag = "<img src=\"" + getImageSrcForWebEngine(image) + "\" border=\"0\" />";
renderImageimage=[…];
字符串标签=”;
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());
    }
}
导入java.awt.Color;
导入java.awt.Graphics2D;
导入java.awt.image.buffereImage;
导入java.awt.image.renderImage;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
导入java.util.Base64;
导入javax.imageio.IIOException;
导入javax.imageio.imageio;
导入javafx.application.application;
导入javafx.scene.scene;
导入javafx.scene.web.WebView;
导入javafx.stage.stage;
公共类WebViewWithMemoryImage扩展了应用程序
{
内存中的私有静态字符串图像;
@凌驾
公共无效开始(阶段primaryStage)
{
WebView WebView=新建WebView();
webView.getEngine().loadContent(“”);
设置场景(新场景(webView,420420));
primaryStage.show();
}
公共静态void main(字符串[]args)引发异常
{
BuffereImage=新的BuffereImage(400400,BuffereImage.TYPE_INT_BGR);
Graphics2D g=image.createGraphics();
尝试
{
g、 setColor(Color.RED);
g、 fillRect(0,040400);
g、 setColor(Color.WHITE);
g、 fillRect(50,50,300,300);
g、 设置颜色(颜色为黑色);
g、 fillRect(100100200200);
g、 drawString(“此WebView中未使用任何图像文件。”,90,70);
}
最后
{
g、 处置();
}
内存中的图像=getImageSrcForWebEngine(图像);
发射(args);
}
公共静态字符串getImageSrcForWebEngine(RenderImageImage)引发IIOException,IOException
{
最终ByteArrayOutputStream输出=新建ByteArrayOutputStream();
写入(图像,“PNG”,输出);
返回“data:base64”+base64.getMimeEncoder().encodeToString(output.toByteArray());
}
}

Hey man如果你在6个月后找到了解决问题的方法,请与我分享我需要与webview相同的方法,谢谢:)不幸的是,情况没有改变,我的应用程序仍然在文件系统上使用临时缓存,因为这种方法适用于任何组件。没有什么新的。我想除非JFX成为像Swing一样广泛,这就足够了。谢谢你的朋友的回复:)我正在通过org.w3c.dom.Element的setAttribute方法设置属性,我必须在流的开头添加“data:image/png;base64”,而不是仅仅“data:base64”。我在这里找到了正确的字符串:没错,自从最初发布此答案以来,JavaFX内部已更新。拖动图像时,此方法存在问题。有什么解决方法吗?这是一个开放性错误()。您认为有解决方法吗?