2011-01-26 2 views
1

Я недавно узнал, что нет жесткого ограничения на объем памяти, который NDK-код может выделять в отличие от сильно ограниченного объема памяти (~ 25 Мб на большинстве устройств), которую вы можете выделить на стороне Java.Использование растрового изображения/холста и NDK

Я хочу написать приложение для обработки изображений (что-то вроде Photoshop), которое должно содержать сразу несколько больших растровых изображений в памяти, где битмап-данные будут занимать ~ 20 Мб памяти. Выполнение этого в Java делает приложение склонным к исключениям из памяти на многих устройствах, которые я пробовал.

Весь мой текущий код использует класс Bitmap и Canvas для выполнения моих манипуляций с изображениями. Может ли кто-нибудь предложить какой-либо способ, который позволяет мне выделить большую часть моей памяти на стороне C и все еще использовать Bitmap + Canvas для выполнения моих операций рисования (с использованием Android 2.1 и выше)?

В качестве примера, если мое изображение составлено из 6 растровых слоев, а пользователь рисует на 3-м уровне, мне нужно нарисовать растровое изображение красно-красного цвета на 3-м уровне, а затем обновить экран, чтобы показать результат выравнивание всех слоев друг над другом в режиме реального времени. Я рассмотрел что-то по линии выделения моих 6 растровых изображений в C как массивы int и выполнения операции рисования на стороне Java с помощью Canvas, используя копию редактируемого слоя, хранящуюся в объекте Bitmap. Я не уверен, как сработает сплющивание.

+0

Я никогда не пробовал, но есть образец кода в sdk, который показывает растровые манипуляции с ndk, но я думаю, что это только avalabe для andorid 2.2 –

ответ

3

Проверьте образец «растровой плазмы» в NDK. Он создает растровое изображение в Java и манипулирует битами в собственном коде. Один из возможных способов состоит в том, что вы можете выделять большие блоки памяти и удерживать изображения в собственном коде и просто визуализировать «представление» в растровом файле, создаваемом Java. Метод визуализации представления и «сглаживания» ваших слоев изображения, вероятно, должен выполняться в собственном коде. Что-то вдоль линий:

... пользователь изменил слой ...

My_native_render_code (MyDisplayBitmap);

invalidate();

Смежные вопросы