2012-06-26 25 views
1

我想從通過onPreviewFrame從相機中獲取的圖像中繪製'Y'組件作爲灰度。Canvas.drawBitmap用黃色的色調繪製圖像

我使用Canvas.drawBitmap的版本,該版本以「顏色」數組作爲參數。 Android文檔沒有提及Color的格式,所以我假設ARGB 8888.

我確實看到了一個圖像,但它顯示出奇怪的黃色色調。

這裏是我下面的代碼:

public void onPreviewFrame(byte[] bytes, Camera camera) {  
    Canvas canvas = null; 
    try { 
     synchronized(mSurfaceHolder) { 
     canvas = mSurfaceHolder.lockCanvas(); 

     Size size = camera.getParameters().getPreviewSize(); 

     int width = size.width; 
     int height = size.height; 
     if (mHeight * mWidth != height * width) 
     { 
      mColors = new int[width * height]; 
      mHeight = height; 
      mWidth = width; 
      Log.i(TAG, "prewviw size = " + width + " x " + height); 
     } 
     for (int x = 0; x < width; x ++) { 
      for (int y = 0; y < height; y++) { 
      int yval = bytes[x + y * width]; 

      mColors[x + y * width] = (0xFF << 24) | (yval << 16) | (yval << 8) | yval; 
      } 
     } 

     canvas.drawBitmap(mColors, 0, width, 0.f, 0.f, width, height, false, null); 
     } 
    } 
    finally { 
     if (canvas != null) { 
     mSurfaceHolder.unlockCanvasAndPost(canvas); 
     } 
    } 
    } 

我一直在使用Canvas.drawBitmap的另一個版本,需要一個位圖作爲參數也試過。我以類似的方式構建了相同陣列的位圖,並且我告訴它明確使用ARGB。但它仍然最終被染成黃色!

我在這裏做錯了什麼?

+0

也許你的相機處於棕褐色模式? –

+1

以下行對於負值是錯誤的: int yval = bytes [x + y * width]; 我正在將一個帶符號的字節提升爲一個整數,然後在其上進行字節移位。添加一個&0xFF解決了這個問題。 – kos

+0

這條評論對我有幫助,但是圖片以灰色來顯示!如果你回答了你自己的問題,這很有用,因爲我花了一段時間才發現評論。 :-) –

回答

0

這是一個不同的方法,但下面的作品,並沒有從您的解決方案的顏色問題遭殃:

YuvImage yuv = new YuvImage(data, previewFormat, size.width, size.height, null); 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    yuv.compressToJpeg(new Rect(0, 0, size.width, size.height), 50, out); 

    byte[] bytes = out.toByteArray(); 
    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
    canvas.drawBitmap(bitmap, null, new Rect(0, 0, size.width, size.height), null); 

注:這可能需要分配爲每幀數據,該解決方案沒有。

相關問題