Java 9高分屏显示支持 - 多分辨率图像 - 在Windows中的命名约定和加载

36

根据这些文章:

http://news.kynosarges.org/2015/06/29/javafx-dpi-scaling-fixed
https://twitter.com/michaelsamarin/status/729234779292483584

Java 9应支持Swing在高DPI显示器上的自动DPI缩放。我已经在最新版本的 Java 9 Early Access Zulu 9 上测试过它,而且效果非常好。

我只无法解决一个问题 - 高分辨率/Retina图像的加载。

根据上面和下面的文章(链接),它应该使用苹果的命名约定 ( @2x ):

image.png, image@2x.png, image@3x.png等。

我测试了以下加载方法:

Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("something/image.png"));

ImageIO.read(getClass().getResource("/something/image.png"));

但这些方法都不起作用(只有基础图像被加载和模糊了)。

根据这个:

https://netbeans.org/bugzilla/show_bug.cgi?id=239745

第一种方法应该是有希望的。

有人对此有任何经验吗(使用Swing或甚至JavaFX)?我不确定我是否做错了什么,还是这个特性还没有实现到当前预发布版的Java 9中。


更新:

应该是可能的:

http://openjdk.java.net/jeps/263

我也尝试遵循以下命名约定(在这里描述):

Windows : image.scale-<dpi-value>.png (image.scale-140.png)
Linux : image.java-scale2x.png
Mac : image@2x.png and image.java-scale2x.png

然而,我找不到任何有效的解决方案或官方信息。我不明白 - 高分辨率显示器今天很常见,而Java应用程序在这些显示器上看起来模糊不清。


2
@2x 可能是指在从 JavaFX 样式中通过 url 引用时工作,而不是在以通用方式加载图像时使用编程 API。 - Oleg Estekhin
2
根据参考JavaFX的文章,我认为支持仅基于JavaFX,您可能需要定义自己的方法,可能需要使用路径、名称和扩展名。 - MadProgrammer
2
@MadProgrammer 这篇文章是关于Java 8u60版本的,这是JavaFX全自动DPI缩放的第一个版本 - 在这个版本中没有对Swing提供此功能的支持。但在Java 9中有,并且我怀疑他们不会制定两个命名约定(一个用于JavaFX,另一个用于Swing)。此外,第三篇文章(NetBeans)是关于Swing的(关于多分辨率图像加载),约定是相同的(它是为Mac准备的,但显然JavaFX将其带到了Windows上)-请看这里:https://netbeans.org/bugzilla/show_bug.cgi?id=239745#c5 - Jolinar
2
你可能还想提供一个可运行的示例,包括图像和项目结构的示例,以供其他人使用 ;) - MadProgrammer
1
@Jolinar 我有点困惑。你想使 Java 9 添加的 DPI 支持在旧版本中可用吗?比如说,通过某种方法解决? - Dioxin
显示剩余10条评论
1个回答

9
作为 HiDPI支持的一部分,Java 9通过 java.awt.MultiResolutionImage接口和 java.awt.image.AbstractMultiResolutionImage等类引入了多分辨率支持。虽然它们在Swing中得到了支持,但在这个领域仍存在 错误 误解
在早期的Java版本中不存在这些问题,因此如果您希望用户能够继续在早期版本的JRE上运行,您需要编写代码来使用普通的Image类。
为了使用它们,您需要像这样做某事
  • 从一组不同分辨率的图像开始:

enter image description here

  • Then create and load the MultiResolutionImage:

    List<Image> imgList = new ArrayList<Image>();
    imgList.add(ImageIO.read(new File("320px-Eagle.jpg"));
    imgList.add(ImageIO.read(new File("800px-Eagle.jpg"));
    imgList.add(ImageIO.read(new File("1024px-Eagle.jpg"));
    imgList.add(ImageIO.read(new File("1280px-Eagle.jpg"));
    imgList.add(ImageIO.read(new File("Eagle.jpg"));
    MultiResolutionImage mrImage = new BaseMultiResolutionImage(imgList.toArray(new Image[0]));
    
  • The use the mrImage object just like any other image.

命名约定并非自动化的:图像分辨率取自图像文件内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接