Я использую библиотеку GPUImage для создания скриншотов/эффектов. Однако на моем Acer Liquid Express с Gingerbread 2.3 он работает только для макс. 1280x720. Попытка установить значение 1600x1200 вызывает размер растрового изображения превышает бюджет VM и VM не позволит нам выделить 7680000 байт. Погружение в код, который я нашел следующее:Уменьшить память в андроиде OpenGL-камера
IntBuffer ib = IntBuffer.allocate(mWidth * mHeight);
IntBuffer ibt = IntBuffer.allocate(mWidth * mHeight);
mGL.glReadPixels(0, 0, mWidth, mHeight, GL_RGBA, GL_UNSIGNED_BYTE, ib);
// Convert upside down mirror-reversed image to right-side up normal
// image.
for (int i = 0; i < mHeight; i++) {
for (int j = 0; j < mWidth; j++) {
ibt.put((mHeight - i - 1) * mWidth + j, ib.get(i * mWidth + j));
}
}
mBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
mBitmap.copyPixelsFromBuffer(ibt);
Как вы можете видеть, это создает 2 буфера, 7680000 байт каждый (1600x1200 * 4) и повернуть его вспять из-за различных 0,0 координат в OpenGL и Java. Я хочу, чтобы удалил второй буфер (чтобы сохранить память) и сохранить функциональность. Является ли это возможным? Если я просто удалю ibt и за, он создает обратное изображение без исключения OutOfMemory. Кроме того, будет полезно сохранить растровое изображение RGB_565, но я абсолютно не знаком с OpenGL. Пожалуйста посоветуй.
Вам действительно нужен альфа-канал? Много раз в пиксельном формате фреймбуфера по умолчанию даже нет битовой плоскости альфа-адресата. И даже когда это происходит, он много раз не нуждается в этом. Вы можете сократить размер на 1/4, если вы его устраните. –
@ AndonM.Coleman Мне не нужен альфа-канал. Не могли бы вы правильно изменить исходный код? – Eugene