2012-02-18 46 views
3

我正在創建一個Android應用程序,該程序要求我創建相機預覽的位圖,以便能夠在預覽中心平均像素,但不管相機被指向時,應用總是返回0,0,0,因爲RGB值是從屏幕中心9x9平方的平均值中讀取的。 preview.java和主要的java文件都在那裏。這是Android的問題(如果有的話,是否有解決方法),還是它與我的代碼問題?謝謝! (對不起,如果代碼是稍顯凌亂)從相機預覽問題中的位圖中讀取像素

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.hardware.Camera; 
import android.hardware.Camera.PictureCallback; 
import android.hardware.Camera.ShutterCallback; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Display; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.FrameLayout; 

public class CameraTest2Activity extends Activity { 
private static final String TAG = "ZTG"; 
Camera camera; 
Preview preview; 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    preview = new Preview(this); 
    ((FrameLayout) findViewById(R.id.preview)).addView(preview); 
    final Button button = (Button) findViewById(R.id.bFire); 
    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      long timeAtStart = System.currentTimeMillis(); 
      TextView rgbDisplay = (TextView) findViewById(R.id.RGBText); 
      Display display = getWindowManager().getDefaultDisplay(); 
      int width = display.getWidth(); 
      int height = display.getHeight(); 
      Log.d(TAG, "Width and Height Retrieved As: " + width + ", " + height); 
      Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config. RGB_565); 
      Canvas c = new Canvas(b); 
      Preview view = (Preview) ((ViewGroup) findViewById(R.id.preview)).getChildAt(0); 
      view.draw(c); 
      String hexValue; 
      int centerX = (display.getWidth()/2); 
      int centerY = (display.getHeight()/2); 

      int test; 


      //test = b.getPixel(240, 350); 
      int sampleWidth = 9; 
      int sampleHeight = 9; 
      int[] pixels = new int[sampleWidth * sampleHeight]; 
      b.getPixels(pixels, 0, 9, centerX - 4, centerY - 4, sampleWidth, sampleHeight); 
      int l = 0; 
      int tempNum; 
      int tempBlue; 
      int tempRed; 
      int tempGreen; 
      int blue = 0; //Color.blue(test); 
      int red = 0; //Color.red(test); 
      int green = 0; // Color.green(test); 
      test = 0; 
      Log.d("lookingFor", "test: " + pixels[1]); 
      while(l < 81){ 
       tempNum = (Integer) pixels[l]; 
       Log.d("lookingFor", "Pixel Num: " + Color.blue(tempNum)); 
       tempBlue = Color.blue(tempNum); 
       tempRed = Color.red(tempNum); 
       tempGreen = Color.green(tempNum); 
       Log.d("lookingFor", "current Blue: " + tempBlue); 
       blue = blue + tempBlue; 
       Log.d("lookingFor", "added blue: " + blue); 
       red = red + tempRed; 
       green = green + tempGreen; 
       l = l + 1; //test g 

      } 
      Log.v("lookingFor", blue + " " + red + " " + green); 
      blue = blue/81; 
      red = red/81; 
      green = green/81; 

      hexValue = Integer.toHexString(test); 
      Log.d(TAG, "pixel at (" + centerX + ", " + centerY + " succesfully retreived! with value of: " + test); 

      Log.d(TAG, "and an Hex value of: " + hexValue); 
      // blue = Color.blue(test); 
      // red = Color.red(test); 
      // green = Color.green(test); 
      //this is a modification 

      Log.d(TAG, "RGB COLOR! R:" + red + " G:" + green + " B:" + blue); 
      long timeAtEnd = System.currentTimeMillis(); 
      long totalTime = timeAtEnd - timeAtStart; 
      Log.d(TAG, "Fetching the color took " + totalTime + " milliseconds"); 
      rgbDisplay.setText("R:" + red + " G:" + green + " B:" + blue); 

     } 
    }); 

    Log.d(TAG, "onCreate'd"); 
} 

ShutterCallback shutterCallback = new ShutterCallback() { 
    public void onShutter() { 
     Log.d(TAG, "onShutter'd"); 
    } 
}; 

/** Handles data for raw picture */ 
PictureCallback rawCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     Log.d(TAG, "onPictureTaken - raw"); 
    } 
}; 

/** Handles data for jpeg picture */ 
PictureCallback jpegCallback = new PictureCallback() { 
    public void onPictureTaken(byte[] data, Camera camera) { 
     FileOutputStream outStream = null; 
     try { 
      // write to local sandbox file system 
      // outStream = 
      // CameraDemo.this.openFileOutput(String.format("%d.jpg", 
      // System.currentTimeMillis()), 0); 
      // Or write to sdcard 
      outStream = new FileOutputStream(String.format(
        "/sdcard/%d.jpg", System.currentTimeMillis())); 
      outStream.write(data); 
      outStream.close(); 
      Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
     } 
     Log.d(TAG, "onPictureTaken - jpeg"); 
    } 
}; 

} 

(這就是主要的Java文件)

import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.hardware.Camera; 
import android.hardware.Camera.PreviewCallback; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

class Preview extends SurfaceView implements SurfaceHolder.Callback { 
private static final String TAG = "Preview"; 

SurfaceHolder mHolder; 
public Camera camera; 

Preview(Context context) { 
    super(context); 

    // Install a SurfaceHolder.Callback so we get notified when the 
    // underlying surface is created and destroyed. 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, acquire the camera and tell it where 
    // to draw. 
    camera = Camera.open(); 
    try { 
     camera.setPreviewDisplay(holder); 

     camera.setPreviewCallback(new PreviewCallback() { 

      public void onPreviewFrame(byte[] data, Camera arg1) { 
       /*FileOutputStream outStream = null; 
       try { 
        outStream = new FileOutputStream(String.format(
          "/sdcard/%d.jpg", System.currentTimeMillis())); 
        outStream.write(data); 
        outStream.close(); 
        Log.d(TAG, "onPreviewFrame - wrote bytes: " 
          + data.length); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } finally { 
       }*/ 
       Preview.this.invalidate(); 
      } 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    // Surface will be destroyed when we return, so stop the preview. 
    // Because the CameraDevice object is not a shared resource, it's very 
    // important to release it when the activity is paused. 
    camera.stopPreview(); 
    camera = null; 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // Now that the size is known, set up the camera parameters and begin 
    // the preview. 
    Camera.Parameters parameters = camera.getParameters(); 
    parameters.setPreviewSize(w, h); 
    camera.setParameters(parameters); 
    camera.startPreview(); 
} 

@Override 
public void draw(Canvas canvas) { 
    super.draw(canvas); 
    Paint p = new Paint(Color.RED); 
    Log.d(TAG, "draw"); 
    canvas.drawText("PREVIEW", canvas.getWidth()/2, 
      canvas.getHeight()/2, p); 
} 
} 

回答

1

你的代碼的平均通過返回在新的位圖b創建的像素值,而不是像素相機預覽或相機圖片。

我認爲你需要把字節數組傳遞給onPreviewFrame,將它從預覽格式(最有可能的YUV422或YUV420)轉換爲你最喜歡的RGB格式,然後對RGB顏色進行數學運算。

+0

謝謝!那就是訣竅! – slazarus 2012-03-27 19:08:57

+0

YUV422或YUV420在哪裏,這是如何轉換爲rgb? – NoBugs 2012-12-19 06:31:10

+0

只是注意到我從來沒有承認你的答案!我的錯!你走了! – slazarus 2013-07-18 19:47:30