2014-01-17 35 views
1

我使用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。请指教。

+0

你真的需要alpha通道吗?很多时候,默认帧缓冲区的像素格式甚至没有目标阿尔法位平面。即使是这样,很多时候也不需要它。如果你消除它,你可以将尺寸减小1/4。 –

+0

@ AndonM.Coleman我不需要alpha通道。你能正确修改源代码吗? – Eugene

回答

0

是的,这是完全可能的。如果你想在CPU上做到这一点,你只需要临时存储来保存一行像素。翻转垂直你交换线路使用通常

temp = a 
a = b 
b = temp 

方法,其中a和b是从大缓冲器线路最顶部 - 底部最朝向垂直中心。对于水平翻转,你可以在线中做同样的事情。

,或者您不使用缓冲区混乱的一切,(在不同的角落里渲染与原点的FBO)使用OpenGL翻转图像前手

+0

如果您根据我的源代码演示如何实现这一点,那将会很棒。 – Eugene

0

这里是一个部分代码解决方案到你的问题。当被问及时,我通常不会重新编写代码,特别是使用我从来没有用过的语言,但是我很无聊。

ShortBuffer sb = ShortBuffer.allocate (mWidth * mHeight); // 2 Bytes per-pixel 
ShortBuffer sbt = ShortBuffer.allocate (mWidth * mHeight); // 2 Bytes per-pixel 

mGL.glReadPixels (0, 0, mWidth, mHeight, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, sb); 

// 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++) { 
    sbt.put ((mHeight - i - 1) * mWidth + j, sb.get (i * mWidth + j)); 
    } 
} 

sbt.flip(); // Rewind the buffer 

mBitmap = Bitmap.createBitmap (mWidth, mHeight, Bitmap.Config.RGB_565); 
mBitmap.copyPixelsFromBuffer (sbt); 

这将减少你的两个缓冲器的大小的一半,但它并没有解决就地翻转图像的问题。如果你这样做,你可以减少50%的所需存储空间。我会把这些留给你,datenwolf的答案应该给你必要的信息来自己做。

+0

感谢您的帮助,但是您的代码生成**缓冲区不足以满足像素**最后一行中的异常'mBitmap.copyPixelsFromBuffer(sbt);' – Eugene