Поддержка отображения 9-мегапиксельной графики в формате Java 9 - изображения с несколькими разрешениями - соглашение об именах и загрузка в Windows

Согласно этим статьям:

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

Java 9 должна поддерживать высокие индикаторы DPI (автоматическое масштабирование DPI) в Swing. Я тестировал его на последней версии Java 9 Early Access + на Zulu 9, и он работает и выглядит действительно замечательно.

Мне не удалось решить только одно: загрузка изображения с высоким разрешением/сетчатки.

Согласно статьям (ссылкам) выше и ниже, он должен использовать соглашение Apple name (@2x):

image.png, [email protected], [email protected] и т.д.

Я тестировал эти методы загрузки:

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 sofar.


Обновить:

Это должно быть возможно:

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

Я также пробовал следующие соглашения об именах (описанные здесь):

Windows : image.scale-<dpi-value>.png (image.scale-140.png)
Linux : image.java-scale2x.png
Mac : [email protected] and image.java-scale2x.png

Однако я не могу найти какое-либо рабочее решение или официальную информацию. Я не понимаю - hdpi-дисплеи распространены сегодня, а приложения Java выглядят как s... на них.

Ответ 1

В рамках поддержки HiDPI Java 9 представила поддержку с несколькими разрешениями через интерфейс java.awt.MultiResolutionImage и java.awt.image.AbstractMultiResolutionImage и другие классы. Хотя они поддерживаются в Swing, в этой области были ошибки и недоразумения.

Они не существуют в более ранних версиях Java, поэтому, если вы хотите, чтобы ваши пользователи могли продолжать работать с более ранними версиями, вам придется писать код, чтобы использовать обычные классы изображений при работе на предыдущих JRE.

Чтобы использовать их, вы делаете что-то вроде:

  • Начать с набора изображений являются разные разрешения:

enter image description here

  • Затем создайте и загрузите 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 же, как и любое другое изображение.

Там нет ничего автоматического соглашения об именах: разрешение изображения взято из содержимого файла изображения.