美文网首页
Capture screen of GLSurfaceView

Capture screen of GLSurfaceView

作者: LvStudio | 来源:发表于2018-12-19 14:41 被阅读0次

    从GLSurfaceView中拿到图片。

    因为项目中视频拍摄使用第三方sdk,但是图片拍摄需要自己实现,而sdk的视频预览使用的是GLSurfaceview,SurfaceView 和 GLSurfaceView是自己独立渲染画面,不同于普通view。所以不能使用普通的view截图方式,在stackoverflow上找到的答案是这样的:

    private Bitmap createBitmapFromGLSurface(int x, int y, int w, int h, GL10 gl)
                throws OutOfMemoryError {
            int bitmapBuffer[] = new int[w * h];
            int bitmapSource[] = new int[w * h];
            IntBuffer intBuffer = IntBuffer.wrap(bitmapBuffer);
            intBuffer.position(0);
    
            try {
                gl.glReadPixels(x, y, w, h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, intBuffer);
                int offset1, offset2;
                for (int i = 0; i < h; i++) {
                    offset1 = i * w;
                    offset2 = (h - i - 1) * w;
                    for (int j = 0; j < w; j++) {
                        int texturePixel = bitmapBuffer[offset1 + j];
                        int blue = (texturePixel >> 16) & 0xff;
                        int red = (texturePixel << 16) & 0x00ff0000;
                        int pixel = (texturePixel & 0xff00ff00) | red | blue;
                        bitmapSource[offset2 + j] = pixel;
                    }
                }
            } catch (GLException e) {
                return null;
            }
    
            return Bitmap.createBitmap(bitmapSource, w, h, Bitmap.Config.ARGB_8888);
        }
    

    其中如何使用这个方法如下:

    private GLSurfaceView glSurfaceView; // findById() in onCreate
    private Bitmap snapshotBitmap;
    
    private interface BitmapReadyCallbacks {
        void onBitmapReady(Bitmap bitmap);
    }
    
    /* Usage code
       captureBitmap(new BitmapReadyCallbacks() {
    
            @Override
            public void onBitmapReady(Bitmap bitmap) {
                someImageView.setImageBitmap(bitmap);
            }
       });
    */
    
    // supporting methods
    private void captureBitmap(final BitmapReadyCallbacks bitmapReadyCallbacks) {
        glSurfaceView.queueEvent(new Runnable() {
            @Override
            public void run() {
                EGL10 egl = (EGL10) EGLContext.getEGL();
                GL10 gl = (GL10)egl.eglGetCurrentContext().getGL();
                snapshotBitmap = createBitmapFromGLSurface(0, 0, glSurfaceView.getWidth(), glSurfaceView.getHeight(), gl);
    
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        bitmapReadyCallbacks.onBitmapReady(snapshotBitmap);
                    }
                });
    
            }
        });
    
    }
    

    感谢:
    https://stackoverflow.com/questions/5514149/capture-screen-of-glsurfaceview-to-bitmap
    https://code.i-harness.com/en/q/5423a5

    相关文章

      网友评论

          本文标题:Capture screen of GLSurfaceView

          本文链接:https://www.haomeiwen.com/subject/esljkqtx.html