Eclipse SWT ImageData getPixel在Windows和Mac OSX上返回不同的值

问题描述 投票:0回答:1

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

我正在使用https://stackoverflow.com/a/27453793中提供的代码段,但在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个回答
0
投票

之所以会这样,是因为您打开了InputStream,然后完全忽略了它,而是从临时文件中创建了ImageDescriptor

根据Files.createTempFile()的文档,此临时文件为空,因此,无论您的操作系统是什么,尝试从该临时文件创建映像都将确保失败。

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

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

如果您认为它在Windows下运行,则可能是由于纯粹的巧合,或者很可能是您无法正确确定它是否失败。您似乎认为在Windows下返回的零像素值表示成功。我对此不太确定。

© www.soinside.com 2019 - 2024. All rights reserved.