我正在使用GPUImage库拍摄屏幕截图/效果。但是,在带有Gingerbread 2.3的Acer Liquid Express上,它仅适用于1280x720最大值。尝试设置1600x1200会导致位图大小超出VM预算,并且VM无法让我们分配7680000字节。深入研究代码,我发现以下内容:
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),并由于OpenGL和Java中的0,0坐标不同而将其反转。我想要的是删除第二个缓冲区(以节省内存)并保留功能。可能吗?如果我简单地删除ibt和for循环,它将创建上下颠倒的映像而没有OutOfMemory异常。另外,保存RGB_565位图会很好,但是我绝对不熟悉OpenGL。请指教。
最佳答案
是的,这完全有可能。如果要在CPU上执行此操作,则只需要临时存储即可容纳一行像素。要垂直翻转,请使用通常的方法将最顶部-最底部的线交换到垂直中心
temp = a
a = b
b = temp
方法,其中a和b是来自大缓冲区的行。对于水平翻转,您需要在行内执行相同的操作。
否则,您根本不会弄乱缓冲区,而是使用OpenGL手动翻转图像(渲染到原点在不同角落的FBO)