从 SurfaceView 获取位图

Posted

技术标签:

【中文标题】从 SurfaceView 获取位图【英文标题】:Get Bitmap from SurfaceView 【发布时间】:2018-02-27 08:38:42 【问题描述】:

我需要将 SurfaceView 的内容转换为位图。我尝试在 SurfaceView 中使用以下代码 sn-p 来实现这一点:

 public final Bitmap getScreenCopy() 
        Bitmap bitmap = Bitmap.createBitmap(
                getWidth(),
                getHeight(),
                Bitmap.Config.ARGB_8888
        );

        Canvas temporaryCanvas = new Canvas(bitmap);
        draw(temporaryCanvas); // Voodoo.

        return bitmap;
    

我从那架无人机收到的位图似乎是透明的,有人知道如何解决吗?

使用 TextureView 是不可能的,因为我使用 Parrot SDK 并且无人机需要 SurfaceView 来显示 Frames。

【问题讨论】:

android: creating a Bitmap with SurfaceView content的可能重复 ***.com/questions/14181498/… 我已经检查过了,对我不起作用 【参考方案1】:

我也一直在尝试找到一种方法来实现这一点,但到目前为止,我还没有找到一种方法来为 API 级别低于 24 的设备做到这一点。我试图弄乱绘图缓存,但我什么也没得到透明度。我没想到 drawingCache 方法会起作用,因为视图本身什么也没画,一切都在Surface上。

对于 API 级别 24 和更高级别,您可以使用 PixelCopy APIs 将全部或部分 SurfaceView 复制到位图中。

这是我的 (Kotlin) 代码中的一个 sn-p:

override fun getPlotBitmap(view: PlotSurfaceView) = Single.create<Bitmap> 
    val plotBitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888)

    val listener = PixelCopy.OnPixelCopyFinishedListener  copyResult ->
        when (copyResult) 
            PixelCopy.SUCCESS -> 
                it.onSuccess(plotBitmap)
            
            else -> 
                it.onError(RuntimeException("Pixel copy failed with result $copyResult"))
            
        
    

    PixelCopy.request(view, plotBitmap, listener, view.handler)

【讨论】:

以上是关于从 SurfaceView 获取位图的主要内容,如果未能解决你的问题,请参考以下文章

Android使用SurfaceView搭建OpenGL环境

Android使用SurfaceView搭建OpenGL环境

Android使用SurfaceView搭建OpenGL环境

android从view切换surfaceview的时候,出现短暂的黑屏,怎么处理

如何从视频中捕获位图图像

一文了解surface,surfaceview,surfaceTexture,GLsurfaceView