След: 2-D Графика
Урок: Работа с Изображениями
Рисование Изображения
Домашняя страница > 2-D Графика > Работа с Изображениями

Рисование Изображения

Поскольку Вы уже учились, Graphics.drawImage метод тянет изображение в определенном расположении:

boolean Graphics.drawImage(Image img,
                   int x, int y,
                   ImageObserver observer);

x,y расположение определяет позицию для верхнего левого из изображения. observer параметр уведомляет приложение обновлений к изображению, которое загружается асинхронно. observer параметр не часто используется непосредственно и не необходим для BufferedImage class, таким образом, это обычно - нуль.

Описанный метод адресует только случай, где все изображение должно быть оттянуто, отображая пиксели изображения на координаты пространства пользователя 1:1. Иногда приложения требуют, чтобы потянуть часть изображения (подизображение), или масштабировать изображение, чтобы покрыть определенную область поверхности рисунка, или преобразовать или фильтровать изображение перед рисунком.

Перегрузки drawImage() метод выполняет эти операции. Например, следующая перегрузка drawImage() метод позволяет Вам потянуть так много указанной области указанного изображения, как в настоящий момент доступно, масштабируя это, чтобы соответствовать в указанной области места назначения drawable поверхности:

boolean Graphics.drawImage(Image img,
       int dstx1, int dsty1, int dstx2, int dsty2,
       int srcx1, int srcy1, int srcx2, int srcy2,
       ImageObserver observer);

src параметры представляют область изображения, чтобы скопировать и потянуть. dst параметры выводят на экран область места назначения, чтобы покрыть исходная область. dstx1, dsty1 координаты определяют расположение, чтобы потянуть изображение. width и размерности height на конечной области вычисляются следующими выражениями: (dstx2-dstx1), (dsty2-dsty1). Если размерности источника и целевых областей будут отличаться, Java 2D™, то API увеличится или уменьшится, как необходимый.

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


Отметьте:  

Если Вы не видите, что апплет работает, Вы должны установить выпуск 6 (или позже) Java Комплект разработчика SE (JDK).


Полный код для этого апплета находится в JumbledImageApplet.java.

Этот пример использует следующий код, чтобы нарисовать смешанный duke_skateboard.jpg изображение. Это выполняет итерации по четырем подизображениям источника, привлекая каждого поочередно в в произвольном порядке выбранный целевой квадрант.

/* divide the image 'bi' into four rectangular
 * areas and draw each of these areas in to a
 * different part of the image, so as to jumble
 * up the image.  'cells' is an array which has
 * been populated with values which redirect
 * drawing of one subarea to another subarea.
 */
int cellWidth = bi.getWidth(null)/2;
int cellHeight = bi.getHeight(null)/2;
for (int x=0; x<2; x++) {
    int sx = x*cellWidth;
    for (int y=0; y<2; y++) {
        int sy = y*cellHeight;
        int cell = cells[x*2+y];
        int dx = (cell / 2) * cellWidth;
        int dy = (cell % 2) * cellHeight;
        g.drawImage(bi,
                    dx, dy, 
                    x+cellWidth, dy+cellHeight,
                    sx, sy,
                    sx+cellWidth, sy+cellHeight,
                    null);
    }
}

Фильтрация Изображений

В дополнение к копированию и масштабированию изображений, Java 2-D API также фильтруют изображение. Фильтрация тянет или производит новое изображение, применяя алгоритм к пикселям исходного изображения. Фильтры изображения могут быть применены при использовании следующего метода:

void Graphics2D.drawImage(BufferedImage img,
                          BufferedImageOp op,
                          int x, int y)

BufferedImageOp параметр реализует фильтр. Следующий апплет представляет изображение, оттянутое сверху текста. Перетащите ползунок, чтобы показать более или менее текста через изображение и сделать изображение более или менее прозрачным.


Отметьте:  

Если Вы не видите, что апплет работает, Вы должны установить выпуск 6 (или позже) Java Комплект разработчика SE (JDK).


Следующий код показывает, как действие фильтра делается, работая на a BufferedImage объект с альфа-каналом и перемасштабами тот альфа-канал при использовании RescaleOp объект. Альфа-канал определяет полупрозрачность каждого пикселя. Это также определяет градус, до которого это изображение перезаписывает.

/* Create an ARGB BufferedImage */
BufferedImage img = ImageIO.read(imageSrc);
int w = img.getWidth(null);
int h = img.getHeight(null);
BufferedImage bi = new
    BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics g = bi.getGraphics();
g.drawImage(img, 0, 0, null);

/*
 * Create a rescale filter op that makes the image
 * 50% opaque.
 */
float[] scales = { 1f, 1f, 1f, 0.5f };
float[] offsets = new float[4];
RescaleOp rop = new RescaleOp(scales, offsets, null);

/* Draw the image, applying the filter */
g2d.drawImage(bi, rop, 0, 0);

Полный пример, представленный в SeeThroughImageApplet.java включает код, который использует ползунок, чтобы скорректировать прозрачность от начальных 50 %. Этот пример также требует duke_skateboard.jpg изображение.

RescaleOp объект является только одним из многих фильтров, которые могут быть созданы. У Java 2-D API есть несколько созданные в фильтрах включая следующее:

Следующий пример использует каждый из описанных фильтров так же как масштабирования:


Отметьте:  

Если Вы не видите, что апплет работает, Вы должны установить выпуск 6 (или позже) Java Комплект разработчика SE (JDK).


Полный код для этого апплета находится в ImageDrawingApplet.java и этот апплет требует bld.jpg изображение.

Используйте выпадающее меню, чтобы выбрать изображение масштабирующаяся или фильтрующая работа.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: чтение/Загрузка Изображения
Следующая страница: Создание и Рисование к Изображению



Spec-Zone.ru - all specs in one place