如何将位图绘制到SurfaceView?

4
我正在尝试使用以下代码在我的SurfaceView上绘制位图:(此代码将在另一个Thread中运行,并且需要在while循环中运行,因为它需要刷新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

你应该在问题中展示完整的异常跟踪。 - fadden
尝试在Stack Overflow上使用此答案... https://dev59.com/cGnWa4cB1Zd3GeqP2qf2#12912187 - Muhammad Waleed
1个回答

5

现在我可以绘制一个位图,但仍有一个问题!

因为右侧屏幕的质量非常糟糕(见图片):

enter image description here

问题解决:

我使用了一个 MemoryStream,将 Bitmap 压缩成质量为 100 的 .JPG,并将 byte 数组解码为 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);
                }
            }
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接