openjdk.ruOpenJDK на русском

JEP 251: Multi-Resolution Images

Изображения с несколькими разрешениями

AuthorsAlexander Scherbatiy, Jim Graham
ОтветственныйAlexandr Scherbatiy
ТипFeature
ОбластьSE
СтатусClosed / Delivered
Выпуск9
Компонентclient-libs / 2d
Обсуждение2d dash dev at openjdk dot java dot net
ТрудоёмкостьM
ДлительностьM
РецензентыJim Graham, Philip Race
ОдобренKevin Rushforth
Создан2014/06/05 08:23
Обновлён2017/06/28 15:07
Задача8046010

Аннотация

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

Описание

Новый API, который будет определён в пакете java.awt.image, позволит объединить набор изображений с разными разрешениями в одно изображение с несколькими разрешениями.

Основные операции над изображением с несколькими разрешениями:

  • получение варианта изображения для конкретного разрешения по заданной метрике DPI и набору преобразований изображения;

  • получение всех вариантов изображения.

Во всём остальном, помимо этих операций, изображение с несколькими разрешениями будет вести себя так же, как обычное изображение. Класс java.awt.Graphics будет получать нужный вариант из изображения с несколькими разрешениями по текущей метрике DPI дисплея и применённым преобразованиям.

Предлагаемый набросок API:

package java.awt.image;

/**
 * This interface is designed to provide a set of images at various resolutions.
 *
 * The {@code MultiResolutionImage} interface should be implemented by any
 * class whose instances are intended to provide image resolution variants
 * according to the given image width and height.
 *
 * @since 1.9
 */
public interface MultiResolutionImage {

    /**
     * Gets a specific image that is the best variant to represent
     * this logical image at the indicated size.
     *
     * @param destImageWidth the width of the destination image, in pixels.
     * @param destImageHeight the height of the destination image, in pixels.
     * @return image resolution variant.
     *
     * @since 1.9
     */
    Image getResolutionVariant(float destImageWidth, float destImageHeight);

    /**
     * Gets a readable list of all resolution variants.
     * Note that many implementations might return an unmodifiable list.
     *
     * @return list of resolution variants.
     * @since 1.9
     */
    public List<Image> getResolutionVariants();
}

Альтернативы

В текущем Java 2D API нельзя определить, используется ли дисплей с высоким разрешением. Как минимум должен предоставляться коэффициент масштабирования DPI. Разработчики могли бы использовать коэффициент масштабирования, чтобы рисовать изображение с нужным разрешением, но это может быть очень утомительно.

Тестирование

Новый API нужно будет протестировать на Mac OS X с дисплеем Retina и на Windows с дисплеем HiDPI.

Можно протестировать следующие сценарии:

  • создание изображения с несколькими разрешениями из набора изображений;

  • создание изображения с несколькими разрешениями из изображений в файловой системе, названных по обычным соглашениям об именовании для масштабирования;

  • создание изображения с несколькими разрешениями на основе другого изображения с несколькими разрешениями;

  • отрисовка изображений с несколькими разрешениями с разными метриками DPI и применённым преобразованием.