Android 호출 시스템 사진 편집 모호 한 해결 방법

안 드 로 이 드 에 서 는 시스템 카 메 라 를 호출 해 사진 을 찍 을 때 되 돌아 오 는 이미지 데 이 터 를 받 지만 이 그림 들 은 전체 사이즈 의 이미지 가 아니 라 시스템 이 준 미리 보기 그림 으로 사진 을 재단 해 표시 할 때 모호 한 그림 을 얻 을 수 있다.다음은 이 문제 에 대해 해결 방법 을 제시한다.
우선,호출 시스템 의 재단 은 Intent intent=new Intent("com.android.camera.action.crop")를 통 해 이 루어 진 다 는 것 을 알 고 있 습 니 다.
그러나 intent 는 도대체 어떤 데 이 터 를 휴대 할 수 있 습 니까?어떤 의미 가 있 습 니까?우 리 는 다음 과 같이 볼 수 있 습 니 다.

위 에는 선택 할 수 있 는 모든 조작 이 포함 되 어 있 으 며,그 중 에는 매우 중요 한 매개 변수 가 있다.
intent.putExtra("return-data",true):재단 후 되 돌아 오 는 데 이 터 를 Bitmap 로 표시 합 니 다.메모리 에 있 는 미리 보기 그림 으로 효과 가 모호 합 니 다.가 져 오 는 방법 은'Activity 의 onActivity Result 방법'입 니 다.

Bundle bundle = data.getExtras();
Bitmap bitmap = bundle.getParcelable("data");

재단 한 원본 그림 을 가 져 오기 위해 서 저 희 는 잘 린 그림 을 로 컬 에 저장 한 다음 로 컬 그림 을 호출 하여 Bitmap 로 직접 돌아 가지 않 습 니 다.

intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

아래 코드 는 사진 찍 기/잘라 서 표시 합 니 다.

 public static int TAKE_PHOTO_REQUEST_CODE = 1; //  
 public static int PHOTO_REQUEST_CUT = 2; //  
 public static int PHOTO_REQUEST_GALLERY = 3; //  
 public Uri imageUri;

 /**
  *       
  */
 private void takePhotos() {

  imageUri = Uri.fromFile(getImageStoragePath(this));
  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  //        
  intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
  startActivityForResult(intent,TAKE_PHOTO_REQUEST_CODE);
 }

  /**
  *         
  */
 private void choicePicFromAlbum() {
  Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
  intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
  startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
 }

  /**
  *         
  * @return
  */
 private File getImageStoragePath(Context context){
  if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
   File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES),"temp.jpg");
   return file;
  }
  return null;
 }

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (requestCode == TAKE_PHOTO_REQUEST_CODE){
   if (imageUri != null){
    startPhotoZoom(imageUri);
   }
  }else if (requestCode == PHOTO_REQUEST_CUT){
   if (imageUri != null) {
    Bitmap bitmap = decodeUriBitmap(imageUri);
    imageView.setImageBitmap(bitmap);
   }
  }else if (requestCode == PHOTO_REQUEST_GALLERY){
   if (data != null) {
    imageUri = data.getData();
    Bitmap bitmap = decodeUriBitmap(imageUri);
    imageView.setImageBitmap(bitmap);
   }
  }
 }

 private Bitmap decodeUriBitmap(Uri uri) {
  Bitmap bitmap = null;
  try {
   bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
  } catch (FileNotFoundException e) {
   e.printStackTrace();
   return null;
  }
  return bitmap;
 }

 /**
  *       
  *
  * @param uri
  */
 public void startPhotoZoom(Uri uri) {
  Intent intent = new Intent("com.android.camera.action.CROP");

  intent.setDataAndType(uri, "image/*");
  // crop true       intent      view    
  intent.putExtra("crop", "true");
  intent.putExtra("scale", true);
  // aspectX aspectY       
  intent.putExtra("aspectX", 1);
  intent.putExtra("aspectY", 1);

  // outputX,outputY         
  intent.putExtra("outputX", 800);
  intent.putExtra("outputY", 800);

  //   true      bitmap,       
  intent.putExtra("return-data", false);
  //       
  intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
  //       
  intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
  //       
  intent.putExtra("noFaceDetection", true);
  startActivityForResult(intent, PHOTO_REQUEST_CUT);
 }
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기