2011-08-12 73 views
0

我有一个运动JPEG流,放在Android的画布上。我的问题是在画布的右下方有一个灰色的像素化的小栏。它有点消失并重新出现。我在其他使用相同流的平台上没有这个问题,所以我猜测它是一个Android问题。这里是我的代码: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); 
      } 
     } 
     }); 

回答

0

canvas = holder.lockCanvas(null);看起来有嫌疑。

尝试用canvas = holder.lockCanvas();代替。

0

我注意到你正在为目标矩形添加一个“Pad”来改变它的高度。

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

dst = new Rect(0, pad, viewWidth, desiredHeight + pad); 
canvas.drawBitmap(bmp, null, dst, null); 
+0

填充只是给了我适当的高度。这个小小的灰色“条”甚至没有覆盖jpeg的整个宽度。就在它的右下角,它的尾迹像素化了。是否有任何BitmapFactory选项可能有帮助? – spentak