将 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
解决了问题。
在我的应用程序中,我将 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
解决了问题。