最近在研究可以開啟手機相機功能,拍完照取出照片的方法。爬了許多文章,發現光是開啟相機前置處理就會影響取出相片時的處理方法。

最基本的調用相機方法:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, 0);



Intent intent = new Intent(MediaStore.ACTIONIMAGECAPTURE); 這行就是利用intent去開啟Android的照相機介面,再然後拍完照,即呼叫onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

     if (resultCode == RESULT_OK) {
          Bitmap mbmp = (Bitmap) data.getExtras().get("data");
          imgMicro.setImageBitmap(mbmp);
     }
}



(Bitmap) data.getExtras().get("data"); 就可以取到照片的"縮圖",沒有錯!只是縮圖。官方文件有說明,android系統分配給每個應用程式的最大內存記憶體是16M,為了防止佔用內存記憶體過大(OutOfMemory),所以把相機拍完回傳的照片經過壓縮。但是我想要再拍完照後可以直接取到原圖,有許多前輩對於這樣情況,對於叫用相機前startActivityForResult(intent, 0); 做了一些修改。

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File tmpFile = new File(Environment.getExternalStorageDirectory(),"image.jpg");
Uri outputFileUri = Uri.fromFile(tmpFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(intent, 0);


File tmpFile = new File(Environment.getExternalStorageDirectory(),"image.jpg"); 這行是利用tmpFile先新增一張照片,在開啟Android的照相機介面時,把這張照片指定為輸出檔案位置。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
     if (resultCode == RESULT_OK) {
          Bitmap bitmap = BitmapFactory.decodeFile(Environment
          .getExternalStorageDirectory() + "/image.jpg");
          imgLarge.setImageBitmap(bitmap);
     }
}



拍完照將結果回傳時,可以透過 Environment.getExternalStorageDirectory() + "/image.jpg" 取得我們指定的圖片路徑。這時侯Intent data則取不到縮圖資料了,若想要取得縮圖就要自己用bitmap原圖去產生縮圖。

Bitmap minibm = ThumbnailUtils.extractThumbnail(bitmap, minWidth, minHeight);
  • minWidth 是縮圖的寬度
  • minHeight 是縮圖的長度

Felix 發表在 痞客邦 PIXNET 留言(0) 人氣()