2014-01-17 34 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