2011-08-12 11 views
0

나는 안드로이드에서 캔버스에 찍힌 모션 JPEG 스트림을 가지고있다. 내 문제는 캔버스의 오른쪽 하단에 약간 회색의 픽셀 막대가 있다는 것입니다. 그것은 다소 사라지고 다시 나타납니다. 동일한 스트림을 사용하는 다른 플랫폼에서이 문제가 발생하지 않으므로 안드로이드 문제를 짐작할 수 있습니다. 내 코드는 다음과 같습니다.안드로이드 비트 맵 문제

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

높이를 변경하기 위해 대상 사각형에 "패드"를 추가하는 것에 주목합니다.

이렇게하면 대상 사각형 크기가 그리는 이미지의 크기와 일치하므로 "보려고하는 회색 바"가 과도하게 지나갈지 궁금합니다. 그냥 추측합니다. 높이 패드를 제거하면 사라질 수 있습니다. 그냥 추측.

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

패딩이 적절한 높이를 제공합니다. 이 작은 회색의 "막대"는 jpeg의 전체 너비를 덮지 않습니다. 그것의 오른쪽 하단 모서리와 그것의 흔적 끝은 pixelated입니다. BitmapFactory 옵션이 도움이 될 수 있습니까? – spentak