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

Posted

技术标签:

【中文标题】Java 9 hdpi 显示支持 - 多分辨率图像 - Windows 中的命名约定和加载【英文标题】:Java 9 hdpi display support - multi-resolution images - name convention and loading in Windows 【发布时间】:2016-12-12 16:12:01 【问题描述】:

根据这些文章:

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

Java 9 应该在 Swing 中支持高 DPI 显示(自动 DPI 缩放)。我已经在Zulu 9 上的Java 9 Early Access + 的最后一个版本上对其进行了测试,它可以工作并且看起来非常棒。

我只能解决一件事 - 高分辨率/视网膜图像加载。

根据上面和下面的文章(链接)应该使用Apple name convention(@2x):

image.pngimage@2x.pngimage@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

我还尝试了以下命名约定(描述为here):

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

但是,我找不到任何可行的解决方案或官方信息。我不明白 - hdpi 显示器在今天很常见,Java 应用程序看起来就像...。

【问题讨论】:

@2x 在被url 从 JavaFX 风格引用时可能意味着工作,而不是在使用编程 API 以通用方式加载图像时。 基于引用 JavaFX 的文章,我会说支持仅基于 JavaFX,您可能需要定义自己的方法,可能需要路径、名称和扩展名 @MadProgrammer 这篇文章是关于 Java 版本 8u60,它是第一个为 JavaFX 提供全自动 DPI 缩放的版本 - 在这个版本中,Swing 不支持此功能。但是在 Java 9 中有,我怀疑他们会制定两种命名约定(一种用于 JavaFX,另一种用于 Swing)。此外,第三篇文章(NetBeans)是关于 Swing(关于多分辨率图像加载)和约定是相同的(它适用于 Mac,但 JavaFX 显然把它带到了 Windows) - 看看这个:netbeans.org/bugzilla/show_bug.cgi?id=239745#c5 根据我读过的所有内容,我不确定 ImageIO 是否会直接支持这一点,并且所有这些都与 Apple 的视网膜显示器有关,如果您使用的是硬件,请不要突出显示 您可能还想提供一个可运行的示例、图像示例和项目结构供人们使用;) 【参考方案1】:

作为HiDPI support 的一部分,Java 9 通过java.awt.MultiResolutionImage 接口和java.awt.image.AbstractMultiResolutionImage 等类引入了多分辨率支持。虽然它们在 Swing 中得到支持,但在这个领域已经有了 bugs 和 misunderstandings。

这些在早期的 Java 版本中不存在,因此如果您希望您的用户能够继续使用早期的运行时运行,您将不得不编写代码以在早期的 JRE 上运行时使用常规的 Image 类。

要使用这些,你do something like:

从一组不同分辨率的图像开始:

然后创建并加载 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]));

使用mrImage 对象就像使用任何其他图像一样。

命名约定没有什么自动的:图像分辨率取自图像文件内容。

【讨论】:

以上是关于Java 9 hdpi 显示支持 - 多分辨率图像 - Windows 中的命名约定和加载的主要内容,如果未能解决你的问题,请参考以下文章

java9新特性-14-多分辨率图像 API

高分问题!android assets目录 -hdpi -xhdpi问题 文件读取

为啥程序读取图像文件后分辨率会变小?

android按钮隐藏属性

远程桌面协议浅析(VNC/SPICE/RDP)

如何为所有 Android 分辨率准备图像?