我在透明度方面遇到了一些问题。
我正在使用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。这是什么原因?
之所以会这样,是因为您打开了InputStream
,然后完全忽略了它,而是从临时文件中创建了ImageDescriptor
。
根据Files.createTempFile()
的文档,此临时文件为空,因此,无论您的操作系统是什么,尝试从该临时文件创建映像都将确保失败。
显然,在尝试从一个空文件中读取图像的错误情况下,ImageDescriptor.createFromFile()
的实现在两个操作系统之间的行为有所不同。
我想正在发生的事情是,在这两种情况下,他们都试图以一种可能的容错方式行事,即默默地失败而不是抛出异常。但是,底层操作系统的故障显然略有不同,因此ImageDescriptor
的初始化最终以不同的方式变得不完整。
如果您认为它在Windows下运行,则可能是由于纯粹的巧合,或者很可能是您无法正确确定它是否失败。您似乎认为在Windows下返回的零像素值表示成功。我对此不太确定。