Java Eclipse SWT ImageData getPixel在Windows和Mac OSX上返回不同的值
我在透明度方面有些问题 我正在使用中提供的代码段,但在Windows上它可以工作,在Mac上却不能 在进一步调查中,不同的似乎是从Java Eclipse SWT ImageData getPixel在Windows和Mac OSX上返回不同的值,java,eclipse,swt,eclipse-rcp,Java,Eclipse,Swt,Eclipse Rcp,我在透明度方面有些问题 我正在使用中提供的代码段,但在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; imp
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。发生这种情况的原因是什么?之所以会发生这种情况,是因为您打开了一个
InputStream
,然后继续完全忽略它,并从临时文件创建ImageDescriptor
根据Files.createTempFile()
的文档,此临时文件为空,因此无论您的操作系统是什么,尝试从中创建映像都会失败
显然,ImageDescriptor.createFromFile()
的实现在尝试从空文件读取图像的错误情况下在两个操作系统之间表现不同
我想发生的是,在这两种情况下,他们都试图以假定的容错方式进行操作,默默地失败,而不是抛出异常。但是,底层操作系统的故障显然略有不同,因此,ImageDescriptor
的初始化以不同的方式结束
如果您觉得它在Windows下工作,那么这可能是由于纯粹的巧合,或者更可能的是,您没有正确地确定它是否失败。您似乎认为windows下返回的零像素值表示成功;我对此不太确定。ImageData.getPixel返回的值不一定是RGB值,它只是当前颜色表的值。必须使用
ImageData
中的PaletteData
获取RGB值:
RGB RGB=imageData.palete.getRGB(imageData.getPixel(0,0));
谢谢您的回复。您是对的,我最初发布的代码中有一个错误(现在已修复)-但这不是我的问题,这只是简化代码以发布问题时的一个意外。我对其进行了编辑,以更好地反映场景。我并没有假设0是一个有效的返回值——我只是注意到了行为上的差异。感谢您的回复——使用上面的方法,我仍然可以得到两个平台(RGB{0,0,0}与RGB{255,255,255})之间行为上的差异。另外(我知道这不是我最初的问题),您可以看到,最终我希望使用它来设置imageData.transparentPixel
,这是一个int
。我使用macOS并得到零,尽管我可以使用ImageDescriptor.createFromURL
来重现FFs。不确定发生了什么。我想我在Windows上看到了相反的行为(即Windows显示255,Mac 0),但它们仍然不同。我会把不确定发生了什么
作为我没有发疯的标志。