0

我有一个放在 Android 画布上的动态 JPEG 流。我的问题是在画布的右下角有一个灰色的像素化小条。它有点消失并重新出现。我在使用相同流的其他平台上没有这个问题,所以我猜这是一个 Android 问题。这是我的代码:

Canvas canvas = null;
            try
            {

                Bitmap bmp = BitmapFactory.decodeByteArray(notifi.imgData, 0, notifi.imgData.length);
                if (bmp == null)
                    System.out.println("Skipping invalid MJpeg frame");
                else
                {
                    canvas = holder.lockCanvas(null);
                    if (canvas == null)
                    {
                        System.out.println("Cannot lock canvas, skipping MJpeg frame");
                        return;
                    }
                    canvas.drawColor(Color.BLACK);

                    Rect dst = null;
                    int viewWidth = mPreview.getWidth();
                    int viewHeight = mPreview.getHeight();
                    float ratio = bmp.getWidth() / (float)bmp.getHeight();
                    int desiredHeight = (int)(viewWidth / ratio);
                    if (desiredHeight > viewHeight)
                    {   // Letterbox
                        int maxWidth = (int)(viewHeight * ratio);
                        int pad = (viewWidth - maxWidth) / 2;
                        dst = new Rect(pad, 0, maxWidth + pad, viewHeight);
                    }
                    else
                    {
                        int pad = (viewHeight - desiredHeight) / 2;
                        dst = new Rect(0, pad, viewWidth, desiredHeight + pad);
                    }

                    canvas.drawBitmap(bmp, null, dst, null);
                }
            } finally {
                if (canvas != null)
                    holder.unlockCanvasAndPost(canvas);
            }
        }
        });
4

2 回答 2

0

canvas = holder.lockCanvas(null);看起来很可疑。

试试canvas = holder.lockCanvas();吧。

于 2011-08-12T21:52:23.153 回答
0

我注意到您正在向目标矩形添加一个“Pad”以更改它的高度。

如果您这样做,我想知道目标矩形大小是否与您正在绘制的图像的大小相匹配,从而“过度绘制”您所看到的一些灰色条。只是一个猜测 - 也许如果你移除高度垫它会消失?只是一个猜测。

dst = new Rect(0, pad, viewWidth, desiredHeight + pad);
canvas.drawBitmap(bmp, null, dst, null);
于 2011-08-12T21:52:31.950 回答