【问题标题】:Android: creating a Bitmap with SurfaceView contentAndroid:使用 SurfaceView 内容创建位图
【发布时间】:2011-06-12 04:30:35
【问题描述】:

恐怕已经对这个问题给出了不幸的答案,但以防万一……我正在使用 SurfaceView 对位图(灯光和颜色修改)进行一些图像处理,我需要导入修改后的位图(即 SurfaceView 的内容)在一个新的位图中,以便我可以将其保存为图像文件。

我一直在环顾四周,似乎可以从 View.getDrawingCache() 获取位图,但它不适用于 SurfaceView。我得到的只是一个空位图。

有什么解决办法吗?

谢谢

【问题讨论】:

    标签: android image-processing bitmap save surfaceview


    【解决方案1】:

    您可以将 SurfaceView 绘制到由位图支持的 Canvas 上吗?

        // be sure to call the createBitmap that returns a mutable Bitmap
        Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); 
        Canvas c = new Canvas(b);
        yourSurfaceView.draw(c);
    

    【讨论】:

    • 我想使用这个解决方案,但是 SurfaceViews 不可能,因为绘图过程是在线程中完成的,并且画布是从 SurfaceHolder 获得的。它是这样使用的:canvas = surfaceHolder.lockCanvas(null);同步(surfaceHolder){doDraw(画布); }
    • 问题已解决。我将 SurfaceView 更改为简单的自定义视图。然后,在创建视图时启用绘图缓存 (setDrawingCacheEnabled(true)),我可以调用 getDrawingCache() 方法检索位图。
    • 对于您的第一条评论,您不能使用支持位图的 Canvas 调用 doDraw 吗? if (screenGrab) { doDraw(c_fromMyPost); } else { doDraw(canvas_fromYourApp); }
    【解决方案2】:

    对于 API 级别 >=24,请使用 PixelCopy API。 这是 ImageView 中的一个示例:

    public void DrawBitmap(){
        Bitmap surfaceBitmap = Bitmap.createBitmap(600, 600, Bitmap.Config.ARGB_8888);
        PixelCopy.OnPixelCopyFinishedListener listener = copyResult -> {
            // success/failure callback
        };
    
        PixelCopy.request(YourSurfaceView, surfaceBitmap,listener,getHandler());
        // visualize the retrieved bitmap on your imageview
        setImageBitmap(plotBitmap);
        }
    }
    

    【讨论】:

      【解决方案3】:

      There is no simple way to capture frames of SurfaceView,所以可以考虑使用TextureView代替SurfaceView:可以使用textureView.getBitmap()方法获取Bitmap。

      【讨论】:

        【解决方案4】:

        只需获取 SurfaceView 的源代码并对其进行修改,即可访问底层位图。

        【讨论】:

        • 这是一个有趣的解决方案。你的意思是编辑Android Sdk并重新编译?您也可以只扩展 SurfaceView。我还能如何修改源代码以允许我访问位图?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多