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

高さを変更するために、宛先の長方形に「パッド」を追加していることに気付きました。

そうすれば、宛先の長方形のサイズが描画している画像のサイズと一致するので、見ているように灰色のバーが「過剰に描画」されるのではないかと思います。推測ですが、ハイトパッドを取り外せば消えるのでしょうか?推測です。

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