Самый быстрый способ нарисовать BufferedImages к другому BufferedImage - PullRequest
4 голосов
/ 04 июля 2010

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

В псевдокоде:

create buffered image big enough to hold entire mosaic
create Graphics2D context from that image

for each buffered subimage that will be a part of the mosaic
   draw the subimage on the graphics context of big bufferedimage
   g2.drawImage(myImage, x,y,width,height,null,null)

Есть ли лучший способ сделать это? Я надеюсь, что есть какая-то операция прямого копирования, так как я не хочу преобразовывать или масштабировать изображения в более крупное изображение. Что-то похожее на массив копий растров каждого подизображения. Я заметил, что есть метод setData, который принимает объект Raster, но метод отмечает, что Raster должен находиться в том же координатном пространстве.

Есть мысли? Это немного узкое место в моей программе, и я бы хотел, чтобы это было как можно быстрее.

EDIT: Оказывается, я ошибался (как это часто бывает, когда делаются предположения без точных данных) о том, где было узкое место. У меня была ошибка, когда многократные 3-мегабайтные изображения читались снова и снова, а не в уменьшенных версиях изображений, кэшированных в памяти. Мое время работы увеличилось с 50 минут до 15 секунд, когда я сделал исправление.

Ответы [ 3 ]

3 голосов
/ 05 июля 2010

Обычно вызов drawImage () напрямую сопоставляется с аппаратной ускоренной операцией блита. В зависимости от используемого драйвера / видеокарты и JVM, масштабирование также должно выполняться с аппаратным ускорением. Однако, если вы можете избежать масштабирования, вы, конечно, должны.

Если подизображения вписываются в большее изображение, вы можете избежать масштабирования, выбрав ширину и высоту так, чтобы они были такими же, как у подизображения, конечно, в этом случае вам лучше использовать g .drawImage (Image img, int x, int y, наблюдатель ImageObserver).

0 голосов
/ 06 декабря 2013

Здесь действительно хороший пример того, как это можно сделать. Я думаю, что это самый быстрый способ.

0 голосов
/ 04 июля 2010

Вы можете вызвать

getPixels(int x, int y, int w, int h, int[] iArray)

в Растре для дополнительного изображения, а затем

setPixels(int x, int y, int w, int h, int[] iArray)

в WritableRaster для увеличения изображения.Что касается эффективности или производительности, то я понятия не имею.Вы должны проверить это сами.Конечно, изображения должны быть одного типа (одинаковое цветовое пространство, одинаковое разрешение и т. Д.), Но кажется, что вы уже предполагаете это.

...