Поддержка отображения 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
же, как и любое другое изображение.
Там нет ничего автоматического соглашения об именах: разрешение изображения взято из содержимого файла изображения.