2014-10-14 14 views
7

Jak przycinać obrazy z kamery. Teraz pokazuje obraz do przycięcia i po wybraniu sekcji przycinania, a następnie naciśnij przycisk "Zapisz". Jest wyświetlany jako "zapisywanie obrazu". Potem nic się nie dzieje. Oto mój kod.Jak przycinać obrazy z aparatu

Przycisk kliknięcie:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString()); 
intent.putExtra("crop", "true"); 
intent.putExtra("aspectX", 0); 
intent.putExtra("aspectY", 0); 
intent.putExtra("outputX", 200); 
intent.putExtra("outputY", 150); 
intent.putExtra("return-data", true); 
startActivityForResult(intent, CAMERA_PIC_REQUEST); 

onActivityResult:

Bundle extras = data.getExtras(); 
Bitmap bitmap = (Bitmap) extras.get("data"); 
if (bitmap != null) { 
    Img_View.setImageBitmap(bitmap); 
} 

Odpowiedz

21

Można użyć tego kodu, aby przeprowadzić przycinanie:

..... 
final int CAMERA_CAPTURE = 1; 
final int CROP_PIC = 2; 
private Uri picUri; 
.... 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button captureBtn = (Button) findViewById(R.id.capture_btn); 
     captureBtn.setOnClickListener(this); 
    } 

    public void onClick(View v) { 
     if (v.getId() == R.id.capture_btn) { 
      try { 
       // use standard intent to capture an image 
       Intent captureIntent = new Intent(
         MediaStore.ACTION_IMAGE_CAPTURE); 
       // we will handle the returned data in onActivityResult 
       startActivityForResult(captureIntent, CAMERA_CAPTURE); 
      } catch (ActivityNotFoundException anfe) { 
       Toast toast = Toast.makeText(this, "This device doesn't support the crop action!", 
         Toast.LENGTH_SHORT); 
       toast.show(); 
      } 
     } 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode == RESULT_OK) { 
      if (requestCode == CAMERA_CAPTURE) { 
       // get the Uri for the captured image 
       picUri = data.getData(); 
       performCrop(); 
      } 
      // user is returning from cropping the image 
      else if (requestCode == CROP_PIC) { 
       // get the returned data 
       Bundle extras = data.getExtras(); 
       // get the cropped bitmap 
       Bitmap thePic = extras.getParcelable("data"); 
       ImageView picView = (ImageView) findViewById(R.id.picture); 
       picView.setImageBitmap(thePic); 
      } 
     } 
    } 

    /** 
    * this function does the crop operation. 
    */ 
    private void performCrop() { 
     // take care of exceptions 
     try { 
      // call the standard crop action intent (the user device may not 
      // support it) 
      Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
      // indicate image type and Uri 
      cropIntent.setDataAndType(picUri, "image/*"); 
      // set crop properties 
      cropIntent.putExtra("crop", "true"); 
      // indicate aspect of desired crop 
      cropIntent.putExtra("aspectX", 2); 
      cropIntent.putExtra("aspectY", 1); 
      // indicate output X and Y 
      cropIntent.putExtra("outputX", 256); 
      cropIntent.putExtra("outputY", 256); 
      // retrieve data on return 
      cropIntent.putExtra("return-data", true); 
      // start the activity - we handle returning in onActivityResult 
      startActivityForResult(cropIntent, CROP_PIC); 
     } 
     // respond to users whose devices do not support the crop action 
     catch (ActivityNotFoundException anfe) { 
      Toast toast = Toast 
        .makeText(this, "This device doesn't support the crop action!", Toast.LENGTH_SHORT); 
      toast.show(); 
     } 
    } 

można użyć następujących prosty samouczek wykonać kadrowanie:

  1. http://khurramitdeveloper.blogspot.in/2013/07/capture-or-select-from-gallery-and-crop.html
  2. http://www.londatiga.net/featured-articles/how-to-select-and-crop-image-on-android/
  3. http://www.coderzheaven.com/2012/12/15/crop-image-android/
  4. http://shaikhhamadali.blogspot.in/2013/09/capture-images-and-crop-images-using.html
+0

Ten kod działa, tylko jedno pytanie muszę zapisz ścieżkę obrazu, ale robi przycięty obraz na to pozwala? i zamiast mapy bitowej, aby pokazać obraz, można użyć nowego uri? – RexDough

+2

Otrzymuję nullPointerException w tej linii. ** Dodatkowe dodatki = data.getExtras(); **. dodatki są zerowe. Używam urządzenia Android M. –

+2

nie działa! ponieważ data.getData() ma wartość zero po CAMERA_CAPTURE – Alex

0

Spróbuj

   Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

       mImageCaptureUri = Uri.fromFile(new File(Environment 
         .getExternalStorageDirectory(), "tmp_avatar_" 
         + String.valueOf(System.currentTimeMillis()) 
         + ".jpg")); 

       intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, 
         mImageCaptureUri); 

       intent.setData(mImageCaptureUri); 
       intent.putExtra("outputX", 200); 
       intent.putExtra("outputY", 200); 
       intent.putExtra("aspectX", 1); 
       intent.putExtra("aspectY", 1); 
       intent.putExtra("scale", true); 
       intent.putExtra("return-data", true);