Введение
Java 2D — это API для создания двухмерной графики на языке программирования Java. Любая операция рисования в Java 2D в конечном счете сводится к заполнению фигуры с помощью заливки и наложению результата на экран.
Java 2D is an API for drawing two dimensional graphics using the Java programming language. Every Java 2D drawing operation can ultimately be treated as filling a shape using a paint and compositing the result onto the screen.
Организация
Java 2D API и его документация доступны для загрузки как часть JDK 6. Классы Java 2D API организованы в следующие пакеты в JDK 6:
Основной пакет для Java Abstract Window Toolkit. Стандартная библиотека двухмерных геометрических фигур, таких как линии, эллипсы и четырехугольники. Библиотека для работы с глифами в Java. Библиотека, предназначенная для работы с различными способами представления цвета. Библиотека для манипулирования графическими изображениями. Библиотека инструментов для печати.
The main package for the Java Abstract Window Toolkit. The Java standard library of two dimensional geometric shapes such as lines, ellipses, and quadrilaterals. The library for manipulating glyphs in Java. The library dealing with the many different ways that color can be represented. The library for manipulating graphical images. The library of tools for writing to paper.
Основные понятия
Эти объекты являются необходимой частью каждой операции рисования в Java 2D.
Формы
Форма в Java 2D — это граница, определяющая внутреннюю и внешнюю области. Пиксели внутри формы затронуты операцией рисования, а пиксели вне формы — нет. Попытка заполнить прямой отрезок линии не приведет к изменению каких-либо пикселей, поскольку такая форма сама по себе не содержит пикселей. Вместо этого следует использовать тонкий прямоугольник, чтобы форма содержала хотя бы несколько пикселей.
Краски
Краска генерирует цвета, которые будут использоваться для каждого пикселя операции заливки. Самая простая краска – это краска, генерирующая один и тот же цвет для всех пикселей. Более сложные краски могут создавать градиенты, изображения или любую их комбинацию. Заливка круглой фигуры желтым цветом приводит к получению сплошного желтого круга, а заливка той же круглой фигуры краской, генерирующей изображение, создаёт круглый фрагмент изображения.
Композиты
Во время любой операции рисования есть источник (пиксели, генерируемые растеризатором) и назначение (пиксели, уже присутствующие на экране). Обычно пиксели источника просто перезаписывают пиксели назначения, но композиция позволяет изменить это поведение. Композиция, принимая на вход пиксели источника и назначения, формирует конечный результат, который в итоге отображается на экране. Наиболее распространенной композицией является , которая может обрабатывать рисуемые пиксели как частично прозрачные, позволяя пикселям назначения просвечивать в определенной степени.
Заполнение
Чтобы заполнить фигуру, первым шагом является определение пикселей, попадающих внутрь фигуры. Эти пиксели будут затронуты операцией заливки. Пиксели, частично находящиеся внутри фигуры и частично за её пределами, могут быть затронуты в меньшей степени, если включено сглаживание. Затем от механизма отрисовки запрашивается генерация цвета для каждого пикселя, который необходимо закрасить. В наиболее распространенном случае, при заливке сплошным цветом, каждому пикселю будет присвоен один и тот же цвет. Компоновщик берет пиксели, сгенерированные механизмом отрисовки, и объединяет их с пикселями, уже отображаемыми на экране, для получения конечного результата.
Усовершенствованные объекты
Эти объекты можно рассматривать как выполняющие свои функции, исходя из принципов работы более простых объектов, описанных выше.
Преобразовать
Каждая 2D-операция в Java подвергается воздействию преобразования, благодаря чему фигуры могут быть перемещены, повернуты, искажены и масштабированы в процессе рисования. Активное преобразование чаще всего является единичным преобразованием, которое не оказывает никакого эффекта. Заливка с применением преобразования может рассматриваться как создание новой, преобразованной фигуры с последующей заливкой этой фигуры.
Инсульт
В дополнение к операции заполнения, Java 2D предоставляет операцию отрисовки. В то время как заполнение рисует внутреннюю часть фигуры, отрисовка рисует её контур. Контур может быть простым, как тонкая линия, или сложным, например, пунктирной линией с закругленными краями у каждого штриха. Объект, ответственный за создание контура, называется stroke (штрих). При наличии входной фигуры, stroke (штрих) создает новую фигуру, представляющую её контур. Например, бесконечно тонкий сегмент линии (без внутренней области) может быть преобразован в прямоугольник шириной в один пиксель. Операцию отрисовки можно описать как создание новой фигуры с применением stroke (штриха) и последующее её заполнение. Технически, stroke (штрих) требуется только принимать входную фигуру и создавать новую фигуру на её основе. Реализация stroke (штриха), поставляемая с Java 2D, реализует описанные выше правила для контуров, но stroke (штрих), написанный пользователем, может создавать любую желаемую форму.
Оптимизация
Концептуально, рисование прямой черной линии в Java 2D можно представить как создание сегмента линии, его преобразование в соответствии с текущим преобразованием, растеризацию для создания тонкого прямоугольника, запрос информации об этой форме для вычисления затронутых пикселей, генерацию этих пикселей и, наконец, наложение результата на экран. Однако выполнение всей этой последовательности шагов для каждой операции рисования было бы крайне неэффективно. Поэтому Java 2D оптимизирует распространенные операции рисования, позволяя пропускать многие из этих шагов. Например, если используется простая однородная заливка, нет необходимости заставлять систему генерировать список цветов для заливки. Аналогично, если используется композит по умолчанию с полной непрозрачностью, нет необходимости запрашивать его выполнение операции наложения, что было бы пустой тратой ресурсов. Java 2D выполняет минимально необходимый объем работы, чтобы создать иллюзию выполнения всех этих шагов для каждой операции, тем самым сохраняя высокую гибкость и производительность.
Место назначения
Для простоты в приведенных в этой статье текстовых примерах предполагается, что экран является устройством назначения. Однако, устройством назначения может быть что угодно, например, принтер, образ памяти или даже объект, принимающий команды Java 2D графики и преобразующий их в векторные графические файлы.
Совместимость Java2D / OpenGL
С Java SE 6 Java2D и OpenGL стали взаимодействовать, позволяя, например, отрисовывать анимированную 3D-графику вместо значков на кнопке (см. JOGL).