Работа в массиве int [] пикселей BufferedImage - PullRequest
6 голосов
/ 03 декабря 2010

При работе с BufferedImage с использованием методов setRGB и getRGB я заметил две вещи:

  1. методы setRGB и getRGB могут быть невероятно медленными в некоторых системах (на два порядка медленнее, чем модификация массива int []).

  2. нет никакой гарантии, что getRGB после setRGB вернет тот же пиксель, который вы пропустили

Этот последний пункт в основном довольно ясен из JavaDoc * set 10 * * setRGB , который гласит:

... Для изображений с IndexColorModel, индекс с ближайшим цветом Избранный.

Видно, я могу работать непосредственно в пикселях int [] BufferedImage, к которым я могу получить доступ, например:

 int[] a = ((DataBufferInt) tmp.getRaster().getDataBuffer()).getData();

Мне было интересно: есть ли какие-то известные недостатки / недостатки при прямом манипулировании пикселями в int[]?

Ответы [ 2 ]

4 голосов
/ 03 декабря 2010

Суть метода getData (), предоставляющего вам доступ к массиву backing int, именно для этой оптимизации, поэтому преимущества, скорее всего, перевешивают недостатки.

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

0 голосов
/ 09 сентября 2016

Не уверен, относится ли это к вашему вопросу, но у вас возникнут проблемы при создании BufferedImage с использованием метода getSubimage(int x, int y, int w, int h).

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

Методы getTileGridXOffset() и getTileGridYOffset() возвращают смещение, несмотря на то, что они описаны как

Возвращает смещение по оси сетки мозаики относительно начала координат, для Например, координата x расположения плитки (0, 0). Это всегда ноль.

но поскольку вы не можете (насколько мне известно) получить доступ к полю scanlineStride растра, вы не сможете получить правильный индекс для массива.

...