Spec-Zone .ru
спецификации, руководства, описания, API
|
Поскольку Вы уже учились, 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 увеличится или уменьшится, как необходимый.
Следующий пример кода делит изображение на четыре квадранта и в произвольном порядке вовлекает каждый квадрант исходного изображения в различный квадрант места назначения.
Если Вы не видите, что апплет работает, Вы должны установить
Полный код для этого апплета находится в 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
параметр реализует фильтр. Следующий апплет представляет изображение, оттянутое сверху текста. Перетащите ползунок, чтобы показать более или менее текста через изображение и сделать изображение более или менее прозрачным.
Если Вы не видите, что апплет работает, Вы должны установить
Следующий код показывает, как действие фильтра делается, работая на 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 есть несколько созданные в фильтрах включая следующее:
ConvolveOp
. Каждый выходной пиксель вычисляется от окружающих пикселей в исходном изображении. Это может использоваться, чтобы размыть или увеличить резкость изображений.AffineTransformOp
. Этот фильтр отображает пиксели в источнике к различной позиции в месте назначения, применяя преобразование на пиксельном расположении.LookupOp
. Этот фильтр использует приложение предоставленная таблица поиска, чтобы повторно отобразить пиксельные цвета.RescaleOp
. Этот фильтр умножает цвета на некоторый фактор. Может использоваться, чтобы осветить или затемнить изображение, увеличить или уменьшить его непрозрачность, и т.д.Следующий пример использует каждый из описанных фильтров так же как масштабирования:
Если Вы не видите, что апплет работает, Вы должны установить
Полный код для этого апплета находится в ImageDrawingApplet.java
и этот апплет требует bld.jpg изображение.
Используйте выпадающее меню, чтобы выбрать изображение масштабирующаяся или фильтрующая работа.