如何将SWT图像转换为数据URI以在Browser-widget中使用

时间:2013-11-02 19:15:15

标签: java swt

我正在尝试在Browser-widget(SWT)中显示图像。这些图像可以在jar文件中找到(插件开发)。但是:这不可能直接实现,因为浏览器小部件需要某种URL或URI信息。

我的想法是将SWT图像转换为数据URI值,我可以将其引入每个给定img元素的src属性。我知道,从性能的角度来看,这不是一个好的解决方案,但我不介意速度劣势。

我想知道如何将SWT图像转换为数据URI值,以便在浏览器窗口小部件中使用

我的代码到目前为止:

package editor.plugin.editors.htmlprevieweditor;

import editor.plugin.Activator;

import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;

public class HtmlPreview extends Composite implements DisposeListener {

    private final Browser content;

    public HtmlPreview(final Composite parent, final int style) {
        super(parent, style);

        this.setLayout(new FillLayout());

        content = new Browser(this, style);
        final ImageData imageData = Activator.getImageDescriptor(Activator.IMAGE_ID + Activator.PREVIEW_SMALL_ID).getImageData();
        content.setText("<html><body><img src=\"data:image/png;base64," + imageData + "\"/></body></html>"); // need help on changing imageData to a base64-encoded String of bytes?

        this.addDisposeListener(this);

    }

    @Override
    public void widgetDisposed(final DisposeEvent e) {
        e.widget.dispose();
    }
}

非常感谢任何帮助:)!

编辑1:我已阅读SWT Image to/from String,但不幸的是,它似乎并未完全满足我的需求。

编辑2:我不知道它是否重要,但我正在尝试加载具有每像素alpha透明度的PNG24图像。

1 个答案:

答案 0 :(得分:2)

如果您只说“SWT中的浏览器”,那么问题就太笼统了。 Mozzila浏览器支持jar URL协议,您可以这样做:

public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    final URL url = ShellSnippet.class.getResource("/icons/full/message_error.gif");
    final Browser browser = new Browser(shell, SWT.MOZILLA);
    final String html = String.format("<html><head/><body>image: <img src=\"%s\"/></body></html>", url);
    browser.setText(html);

    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    display.dispose();
}

看起来像这样:

enter image description here

我使用了JFace jar中的图像来保持代码片段简单,但对大多数人来说都是开箱即用的。它是GIF,但我希望它与PNG文件一样好用。

如果您使用Internet Explorer,我建议不要使用,因为您的应用程序依赖于操作系统版本,这不起作用。它看起来像这样(在片段中将样式从SWT.MOZILLA更改为SWT.NONE):

enter image description here

但它理解file协议,您可以将文件复制到临时文件夹,并使用File.toURL()直接创建URL到文件。这适用于任何浏览器。

我无法在WEBKIT broswer上测试简单的解决方案。如果有人可以,请将结果发表在评论中。