Android copyPixelsFromBuffer () для определенного смещения растрового изображения? - PullRequest
3 голосов
/ 04 ноября 2010

Я работаю над приложением для Android, которое работает с графическими операциями в собственном коде в буфере общей памяти.Я создал функции для вызова своего собственного кода из Java с использованием JNI, а мой собственный код использует API JNI для вызова Java из собственного кода.Поскольку копирование больших массивов пикселей оказывает значительное влияние на производительность, мне нужно как можно больше этого избегать.

В документации Android для класса Bitmap говорится о двух способах копирования пикселей во внутренний буфер Bitmap: http://developer.android.com/reference/android/graphics/Bitmap.html

setPixels (int [] пиксели, смещение int, шаг int, int x, int y, ширина int, высота int) Заменить пиксели в растровом изображении цветами в массиве.

copyPixelsFromBuffer (Buffer src) Копирует пиксели из буфера, начиная с текущей позиции, перезаписывая пиксели растрового изображения.

Проблема с документацией API заключается в том, что она очень расплывчата в том, что происходит за кулисамиВы используете эти функции.Однако где-то упоминается, что copyPixelsFromBuffer () копирует пиксели напрямую без какого-либо внутреннего преобразования цветового формата, в отличие от setPixels (), который во всех случаях будет выполнять это преобразование, даже если исходные пиксели имеют целевой формат пикселей.Очевидно, что это не то, чего я хочу, поскольку пиксели в моем буфере уже находятся в хорошем формате.

Теперь copyPixelsFromBuffer () выглядит очень хорошо, поскольку не будет выполнять это преобразование, но документация этого не делает.поговорим о том, как скопировать пиксели из буфера в конкретное смещение в целевом растровом изображении.К сожалению, это очень важно, так как я не хочу каждый раз копировать весь буфер, а только область в нем.Да, в документации сказано, что он будет копировать из текущей позиции в исходном буфере , но ничего не сказано о целевом буфере.SetPixels () выполняет ненужное преобразование, но позволяет указать смещение в целевом буфере.

Итак, я застрял между:

Копирование только той области, которую я хочу, за счетс преобразованием пикселей

ИЛИ

Предотвращение преобразования пикселей за счет копирования всего буфера каждый раз

Чтобы получить представление, у меня может быть буфер, представляющий экран 1024x768,с недопустимым регионом, который изменяется от (300 300) до (400 400).

Если я копирую только тот регион, который мне нужно обновить, я могу копировать и конвертировать 100 * 100 пикселей или копировать без преобразования 1024 * 768 пикселей.недопустимая область размером 100x100 мала и только в конкретном случае большинство недопустимых областей будет занимать гораздо большую часть буфера.Оба метода очень негативно влияют на производительность.

Кто-нибудь имеет представление о том, как я мог бы копировать пиксели из моего буфера с определенным смещением в целевом буфере без принудительного преобразования пикселей?Это было бы лучшее из обоих миров, и я не понимаю, почему он не доступен.

Большое спасибо за вашу помощь

1 Ответ

0 голосов
/ 05 ноября 2010

Возможно, функция не принимает смещение пункта назначения, потому что она просто автоматически использует смещение источника как для источника, так и для пункта назначения.Вы должны попробовать это.

-n

...