36

根据这些文章:

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

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

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

根据上面和下面的文章(链接),它应该使用Apple 名称约定@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

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

4

1 回答 1

9

作为HiDPI 支持的一部分,Java 9 通过java.awt.MultiResolutionImage接口和java.awt.image.AbstractMultiResolutionImage等类引入了多分辨率支持。尽管它们在 Swing 中得到支持,但在这方面存在错误误解

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

要使用这些,您可以执行以下操作:

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

在此处输入图像描述

  • 然后创建并加载 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像使用任何其他图像一样使用对象。

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

于 2018-06-28T17:27:32.757 回答