我使用GPUImage库来获取屏幕截图/效果。但是,在我的Acer Liquid Express with Gingerbread 2.3上,它仅适用于最大1280x720。试图设置1600x1200原因位图大小超过虚拟机预算和虚拟机不会让我们分配7680000字节。潜水到代码中,我发现以下几点:减少Android 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个缓冲器,每768万个字节(1600×1200 * 4)和反向,因为在OpenGL和Java不同的0,0坐标。我想要的是删除第二个缓冲区(以节省内存)并保持功能。可能吗?如果我只是删除ibt和的循环,它会创建没有OutOfMemory异常的颠倒图像。另外,保存RGB_565位图会很好,但我绝对不会熟悉OpenGL。请指教。
你真的需要alpha通道吗?很多时候,默认帧缓冲区的像素格式甚至没有目标阿尔法位平面。即使是这样,很多时候也不需要它。如果你消除它,你可以将尺寸减小1/4。 –
@ AndonM.Coleman我不需要alpha通道。你能正确修改源代码吗? – Eugene