2014/11/02

Android Camera取得照片RGB平均值

主要程式碼請參考「Android Camera擷取方框範圍內影像」

關鍵Code:
@Override
 public void onPictureTaken(byte[] data, Camera camera) {
  try {

   ByteArrayInputStream stream = new ByteArrayInputStream(data);
   Bitmap bitmap = BitmapFactory.decodeStream(stream);
   stream.close();
   stream = null;

   // 螢幕解析度
   Point screenSize = new Point();
   getWindowManager().getDefaultDisplay().getSize(screenSize);

   // 照片解析度 / 預覽解析度 = 照片倍率
   float widthRate = picWidth >= pvWidth ? picWidth / pvWidth : pvWidth / picWidth;
   float heightRate = picHeight >= pvHeight ? picHeight / pvHeight : pvHeight / picHeight;

   // 預覽解析度/螢幕解析度 = 差異倍率
   float screenWidthRate = screenSize.x >= pvWidth ? screenSize.x / pvWidth : pvWidth / screenSize.x;
   float screenHeightRate = screenSize.y >= pvHeight ? screenSize.y / pvHeight : pvHeight / screenSize.y;

   // 取得ImageView x,y
   int[] location = new int[2];
   imageview.getLocationOnScreen(location);

   // 求得新座標
   location[0] *= screenWidthRate * widthRate;
   location[1] *= screenHeightRate * heightRate;

   // 求得新尺寸
   int newWidth = (int) (imageview.getWidth() * widthRate * screenWidthRate);
   int newHeight = (int) (imageview.getHeight() * heightRate * screenHeightRate);

   // 擷取範圍
   Bitmap bitmapRect = Bitmap.createBitmap(bitmap, location[0], location[1], newWidth, newHeight);
   bitmap = null;

   FileOutputStream fileOutputStream = new FileOutputStream(
     new File("/sdcard/" + new Date().getTime() + ".jpg"));
   bitmapRect.compress(CompressFormat.JPEG, 90, fileOutputStream);

   // 寫入檔案
   fileOutputStream.flush();
   fileOutputStream.close();
   fileOutputStream = null;

   toralR = 0;
   totalG = 0;
   totalB = 0;

   int count = 0;

   for (int w = 0; w < bitmapRect.getWidth(); w++) {
    for (int h = 0; h < bitmapRect.getHeight(); h++) {
     count++;
     int pixel = bitmapRect.getPixel(w, h);
     toralR += Color.red(pixel);
     totalG += Color.green(pixel);
     totalB += Color.blue(pixel);
    }
   }

   toralR /= count;
   totalG /= count;
   totalB /= count;

   Toast.makeText(MainActivity.this, "Red:" + toralR + ", Green:" + totalG + ", Blue:" + totalB, 1).show();

   bitmapRect = null;
   // 重啟相機預覽功能
   camera.startPreview();

  } catch (IOException e) {
   Log.i("Tack_IOException", e.getMessage());
  }
 }

執行結果: