1

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

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

我想知道如何将 SWT 图像转换为 data-URI 值以便在 browser-widget 中使用

到目前为止我的代码:

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 图像。

4

1 回答 1

2

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

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

它看起来像这样:

在此处输入图像描述

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

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

在此处输入图像描述

但是它确实理解file协议,您可以将文件复制到临时文件夹并使用File.toURL(). 这应该适用于任何浏览器。

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

于 2013-11-03T09:54:00.467 回答