将 JarURLInputStream 用于 JavaFX 图像

Using JarURLInputStream for JavaFX Image

在我的应用程序中,我将 JavaFX 的 Image class 与 InputStream 一起使用。 InputStream 是通过调用 URL.openStream() 提供的,它与指向文件的 URLs 配合使用效果很好。但是,如果我有 jar:file:C:/some.jar!/someImage.bmp 形式的 URL,则图像未正确加载。这是我正在试验的片段:

 InputStream stream = url.openStream();
 Image image = new Image(stream);

 StackPane stackLayout = new StackPane();
 stackLayout.getChildren().add(new ImageView(image));

 Stage stage= new Stage(new Scene(stackLayout));
 stage.setScene(scene);
 stage.show();

我使用

验证了URL是正确的
Files.copy(stream, new File("copy-image.bmp").toPath());

这会在 jar 存档中生成文件的副本。我认为 JavaFX 的 Image class 有问题(我正在使用 2.2.67-b01)。

经过更多测试后,我发现这显然是(至少)JavaFX 2.2.67-b01 中的一个错误。问题与流无关,而是与要加载的图像的位深度有关:可以毫无问题地加载 24 位图像,而尝试加载 32 位图像会导致错误。

切换到 JavaFX 8.0.31-b13 附带的 JDK 1.8.0_31 解决了问题。