【问题标题】:Eclipse SWT ImageData getPixel returns different values on Windows vs Mac OSXEclipse SWT ImageData getPixel 在 Windows 和 Mac OSX 上返回不同的值
【发布时间】:2020-07-11 08:48:52
【问题描述】:

我在透明度方面遇到了一些问题。

我正在使用https://stackoverflow.com/a/27453793 中提供的 sn-p,但是在 Windows 上它可以工作,但在 Mac 上却不行。

在进一步调查中,不同之处似乎是从 getPixel 返回的值。

以下面的例子为例,使用我创建的 1x1 像素透明图像。

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;

import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;

public class ImageTest {
    public static void main(final String[] args) throws MalformedURLException, IOException {
    try (InputStream stream = new URL("https://i.imgur.com/BFlkniE.png").openStream()) {
        final Path path = Files.createTempFile(null, ".png");
        Files.copy(stream, path, StandardCopyOption.REPLACE_EXISTING);

        final ImageDescriptor element = ImageDescriptor.createFromFile(null, path.toString());

        final Image image = element.createImage();
        final ImageData imageData = image.getImageData();

        System.out.println(imageData.getPixel(0, 0));
    }
    }
}

在 Windows 上,输出为 0,在 Mac 上为 16711680。这是什么原因?

【问题讨论】:

    标签: java eclipse swt eclipse-rcp


    【解决方案1】:

    ImageData.getPixel返回的值不一定是RGB值,只是当前色表的一个值。必须使用ImageData中的PaletteData来获取RGB值:

    RGB rgb = imageData.palette.getRGB(imageData.getPixel(0, 0));
    

    【讨论】:

    • 感谢您的回复 - 使用上述内容,我仍然发现两个平台之间的行为有所不同(RGB {0, 0, 0} vs RGB {255, 255, 255})。另外(我很感激这不是我最初的问题),你可以看到最终我想用它来设置imageData.transparentPixel,这是一个int
    • 我正在使用 macOS 并得到零,尽管我可以使用 ImageDescriptor.createFromURL 重现 FF。不知道发生了什么。
    • 我想我在 Windows 上得到了相反的行为(即 Windows 然后显示 255,Mac 0),但它们仍然不同。我会把Not sure what is happening 当作我不会发疯的标志。
    【解决方案2】:

    发生这种情况是因为您打开了一个InputStream,然后您继续完全忽略它,而是从一个临时文件创建您的ImageDescriptor

    根据Files.createTempFile() 的文档,这个临时文件是空的,所以无论你的操作系统是什么,尝试从它创建一个镜像都会失败。

    显然ImageDescriptor.createFromFile() 的实现在尝试从空文件读取图像的错误情况下在两个操作系统之间的行为不同。

    我想正在发生的事情是,在这两种情况下,他们都试图以一种所谓的容错方式行事,默默地失败而不是抛出异常。但是,底层操作系统的失败显然略有不同,因此ImageDescriptor 的初始化最终会以不同的方式不完整。

    如果您认为它在 Windows 下运行,那么这可能是由于纯巧合,或者更有可能是您没有正确确定它是否失败。您似乎认为在 windows 下返回的零像素值表示成功;我不太确定。

    【讨论】:

    • 感谢您的回复。您是对的,我最初发布的代码中存在错误(现已修复)-但这不是我的问题,这只是简化代码以发布问题时的意外。我已经对其进行了编辑以更好地反映场景。我没有假设 0 是一个有效的返回值——而是我只是注意到行为上的差异。
    猜你喜欢
    • 2011-12-15
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多