【问题标题】:How to draw a bitmap to a SurfaceView?如何将位图绘制到 SurfaceView?
【发布时间】:2016-05-31 11:10:44
【问题描述】:

我正在尝试使用以下代码为我的SurfaceView 绘制位图:(这将在另一个Threadwhile 中运行,因为它需要刷新SurfaceView)。

        while (true)
        {
            try
            {
                // Enable drawing
                // ERROR LINE!
                Canvas ca = mPreview2.Holder.LockCanvas();

                // Get current frame
                Bitmap test = mediaPlayer.CurrentFrame;

                // Actual drawing
                Paint paint = new Paint();
                ca.DrawBitmap(test, 0, 0, paint);   

                // Stop drawing
                mPreview2.Holder.UnlockCanvasAndPost(ca);
            } catch (Exception ex)
            {
                throw ex;
            }
        }

但我收到以下错误:(这是在线发生的:Canvas ca = mPreview2.Holder.LockCanvas();

Java.Lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.isRecycled()' on a null object reference

【问题讨论】:

标签: android xamarin xamarin.android surfaceview android-bitmap


【解决方案1】:

现在我可以画一个位图,但我还有一个问题!

因为右屏的画质真的很差(见图):

问题已解决:

我所做的是使用MemoryStreamBitmap 压缩为质量为100 的.JPG,并将byte array 解码为Bitmap。现在效果很好!见以下代码:

   private void DrawCanvas()
        {
            while (true)
            {
                Canvas canvas = holder2.LockCanvas();

                if (canvas != null)
                {
                    Bitmap currentBitmap = mediaPlayer.CurrentFrame;

                    if(currentBitmap != null)
                    {
                        Paint paint = new Paint();

                        MemoryStream ms = new MemoryStream();

                        currentBitmap.Compress(Bitmap.CompressFormat.Jpeg, 100, ms);

                        byte[] bitmapData = ms.ToArray();

                        Bitmap bitmap = BitmapFactory.DecodeByteArray(bitmapData, 0, bitmapData.Length);

                        Bitmap scaledBitmap = Bitmap.CreateScaledBitmap(bitmap, mPreview2.Width, mPreview2.Height, true);

                        canvas.DrawBitmap(scaledBitmap, 0, 0, paint);

                        bitmap.Recycle();
                        scaledBitmap.Recycle();
                        currentBitmap.Recycle();
                    }
                    holder2.UnlockCanvasAndPost(canvas);
                }
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多