2012-06-26 21 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); 

注:这可能需要分配为每帧数据,该解决方案没有。

相关问题