Java 2D — это API для рисования двухмерной графики с использованием языка программирования Java . Каждая операция рисования Java 2D в конечном итоге может рассматриваться как заполнение формы с помощью краски и компоновка результата на экране .
Java 2D API и его документация доступны для загрузки как часть JDK 6. Классы Java 2D API организованы в следующие пакеты в JDK 6:
java.awt
Основной пакет для Java Abstract Window Toolkit .java.awt.geom
Стандартная библиотека Java для двумерных геометрических фигур, таких как линии, эллипсы и четырехугольники.java.awt.font
Библиотека для работы с глифами в Java.java.awt.color
Библиотека, в которой рассматриваются различные способы представления цвета.java.awt.image
Библиотека для работы с графическими изображениями.java.awt.print
Библиотека инструментов для письма на бумаге.Эти объекты являются необходимой частью каждой операции рисования Java 2D.
Форма в Java 2D — это граница, которая определяет внутреннюю и внешнюю части. Пиксели внутри формы затрагиваются операцией рисования, а те, что снаружи — нет .
Попытка заполнить сегмент прямой линии не приведет к тому, что пиксели не будут затронуты, поскольку такая форма сама по себе не содержит пикселей. Вместо этого необходимо использовать тонкий прямоугольник , чтобы форма содержала несколько пикселей.
Краска генерирует цвета, которые будут использоваться для каждого пикселя операции заливки. Самая простая краска — это , которая генерирует один и тот же цвет для всех пикселей. Более сложные краски могут создавать градиенты, изображения или любые комбинации цветов. Заливка круглой формы желтым цветом приводит к получению сплошного желтого круга, в то время как заливка той же круглой формы краской, которая генерирует изображение, приводит к круглому вырезанию изображения.java.awt.Color
Во время любой операции рисования есть источник (пиксели, создаваемые краской) и пункт назначения (пиксели, уже находящиеся на экране). Обычно исходные пиксели просто перезаписывают пиксели назначения, но композит позволяет изменить это поведение.
Композит, учитывая исходные и конечные пиксели, производит конечный результат, который в конечном итоге оказывается на экране. Наиболее распространенный композит — это java.awt.AlphaComposite
, который может обрабатывать отрисовываемые пиксели как частично прозрачные, так что конечные пиксели видны в некоторой степени.
Чтобы заполнить фигуру, первым шагом является определение того, какие пиксели попадают внутрь фигуры. Эти пиксели будут затронуты операцией заполнения. Пиксели, которые частично находятся внутри и частично снаружи фигуры, могут быть затронуты в меньшей степени, если включено сглаживание .
Затем краске предлагается сгенерировать цвет для каждого из пикселей, которые нужно закрасить. В общем случае заливки сплошным цветом каждому пикселю будет присвоен один и тот же цвет.
Композитный процесс берет пиксели, созданные краской, и объединяет их с пикселями, уже имеющимися на экране, чтобы получить конечный результат.
Эти объекты можно рассматривать как выполняющие свои функции с точки зрения более простых объектов, описанных выше.
Каждая операция Java 2D подчиняется преобразованию , так что фигуры могут быть переведены, повернуты, срезаны и масштабированы по мере их рисования. Активным преобразованием чаще всего является тождественное преобразование , которое ничего не делает.
Заполнение с использованием преобразования можно рассматривать как простое создание новой, преобразованной формы и последующее заполнение этой формы.
В дополнение к операции fill Java 2D предоставляет операцию draw . В то время как fill рисует внутреннюю часть фигуры, draw рисует ее контур. Контур может быть таким же простым, как тонкая линия, или таким сложным, как пунктирная линия, где каждый штрих имеет закругленные края.
Объектом, ответственным за создание контура, является штрих . При наличии входной формы штрих создает новую форму, представляющую его контур. Например, бесконечно тонкий отрезок линии (без внутренней части) может быть обведен в прямоугольник шириной в один пиксель.
Таким образом, операцию рисования можно описать как создание нового обведенного объекта и последующую заливку этого объекта.
Технически говоря, штрих требуется только для того, чтобы принять входную форму и создать новую форму. Реализация штриха, предоставляемая Java 2D, реализует правила контура, описанные выше, но специально написанный штрих может создать любую форму, которую пожелает.
Концептуально рисование прямой черной линии в Java 2D можно представить как создание отрезка линии, его преобразование в соответствии с текущим преобразованием, обводку для создания тонкого прямоугольника, запрос этой фигуры для вычисления затронутых пикселей, генерацию пикселей с помощью java.awt.Color.BLACK
, а затем компоновку результатов на экране.
Однако выполнение всей этой последовательности шагов для каждой операции рисования было бы очень неэффективным. Поэтому Java 2D оптимизирует общие операции рисования, так что многие из этих шагов можно пропустить. Например, если краска представляет собой простой сплошной цвет, нет необходимости фактически отдавать ему команду на создание списка цветов для рисования. Аналогично, если используется полностью непрозрачный композит по умолчанию, фактически просить его выполнить операцию компоновки не нужно и это будет пустой тратой усилий.
Java 2D выполняет минимальный объем работы, необходимый для создания впечатления , что он выполняет все эти шаги для каждой операции, тем самым сохраняя как большую гибкость, так и высокую производительность.
Для простоты текстовые примеры, представленные в этой статье, предполагали, что экран является устройством назначения. Однако, местом назначения может быть что угодно, например принтер, образ памяти или даже объект, который принимает команды Java 2D-графики и преобразует их в файлы векторных графических изображений.
Начиная с Java SE 6 , Java2D и OpenGL стали совместимыми, что позволяет, например, рисовать анимированную 3D-графику вместо иконок на кнопке (см. JOGL ).