為什麼要註明Render截圖?
因為目前Android官方推出的標準截圖方法必須建立在「有辦法取得影片檔案的Description」上。
但影片格式越來越多樣,即使檔名不變,但Description可能無法支援的情況會發生。
所以必須要直接從Render上取得「要撥出的影像畫質內容」。
因為目前Android官方推出的標準截圖方法必須建立在「有辦法取得影片檔案的Description」上。
但影片格式越來越多樣,即使檔名不變,但Description可能無法支援的情況會發生。
所以必須要直接從Render上取得「要撥出的影像畫質內容」。
關鍵在於取得Render內的GL10。(其實不是「Render內」,而是onRenderDraw/onDrawFrame這些函數中,會取得GL傳入的GL10。)
取得後,資料轉換的方法就很固定了。
void screenShot(GL10 gl) {
int screenshotSize = mCurrentViewportWidth * mCurrentViewportHeight;
ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4);
bb.order(ByteOrder.nativeOrder());
gl.glReadPixels(0, 0, mCurrentViewportWidth, mCurrentViewportHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb);
int pixelsBuffer[] = new int[screenshotSize];
bb.asIntBuffer().get(pixelsBuffer);
bb = null;
Bitmap bitmap = Bitmap.createBitmap(mCurrentViewportWidth, mCurrentViewportHeight, Bitmap.Config.RGB_565);
bitmap.setPixels(pixelsBuffer, screenshotSize-mCurrentViewportWidth, -mCurrentViewportWidth, 0, 0, mCurrentViewportWidth, mCurrentViewportHeight);
pixelsBuffer = null;
short sBuffer[] = new short[screenshotSize];
ShortBuffer sb = ShortBuffer.wrap(sBuffer);
bitmap.copyPixelsToBuffer(sb);
//Making created bitmap (from OpenGL points) compatible with Android bitmap
for (int i = 0; i < screenshotSize; ++i) {
short v = sBuffer[i];
sBuffer[i] = (short) (((v&0x1f) << 11) | (v&0x7e0) | ((v&0xf800) >> 11));
}
sb.rewind();
bitmap.copyPixelsFromBuffer(sb);
}
沒有留言:
張貼留言