2013-02-02 266 views
0

我正在使用takePicture function in the Camera在平板电脑上连续拍摄和存储图像。我需要知道如何裁剪调用takePicture时存储的数据。或者,如果这是不可能的,那么我需要知道我如何在图像中阅读,然后使用其他东西来裁剪它。到目前为止,我发现这个问题的唯一解决方案需要打开另一个应用程序进行裁剪。任何帮助表示赞赏。在android中裁剪图像

回答

2

你可以试试下面的代码来裁剪图像:

final String Path = "sdcard/test.jpg"; 
Bitmap bitmap = BitmapFactory.decodeFile(Path); 
ivSign.setImageBitmap(Bitmap.createScaledBitmap(bitmap, 150, 150, true)); 
Intent cropIntent = new Intent("com.android.camera.action.CROP"); 
// indicate image type and Uri 
cropIntent.setDataAndType(Uri.fromFile(new File(Path)), "image/*"); 
// set crop properties 
cropIntent.putExtra("crop", "true"); 
// indicate aspect of desired crop 
cropIntent.putExtra("aspectX", 1); 
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, 1); 
0

从下面的代码,你会得到正确的思想。有时你会得到 问题,如果该设备是像三星Galaxy S3,你想捕捉后的图像,因为他们 捕捉图像后返回null意图。

在这个问题上花费了几个小时后,如果有人在将来会遇到这个问题,我最终会让它在下面的路上工作。

public class MainActivity extends Activity { 
    private Uri mImageCaptureUri; 
    private ImageView mImageView; 

    private static final int PICK_FROM_CAMERA = 1; 
    private static final int CROP_FROM_CAMERA = 2; 
    private static final int PICK_FROM_FILE = 3; 

    private String selectedImagePath = ""; 
    boolean GallaryPhotoSelected = false; 

    public static String Finalmedia = ""; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.main); 

     final String[] items = new String[] { "Take from camera", 
       "Select from gallery" }; 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.select_dialog_item, items); 
     AlertDialog.Builder builder = new AlertDialog.Builder(this); 

     builder.setTitle("Select Image"); 
     builder.setAdapter(adapter, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int item) { // pick from 
                    // camera 
       if (item == 0) { 
        String storageState = Environment.getExternalStorageState(); 

        if (storageState.equals(Environment.MEDIA_MOUNTED)) { 
         Intent intent = new Intent(
           MediaStore.ACTION_IMAGE_CAPTURE); 
         // intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, 
         // mImageCaptureUri); 
         // if (hasImageCaptureBug()) { 

         String path = Environment.getExternalStorageDirectory() 
           .getName() 
           + File.separatorChar 
           + System.currentTimeMillis() + ".jpg"; 
         File file = new File(path); 
         // mImageCaptureUri = Uri.fromFile(new File(
         // Environment.getExternalStorageDirectory(), 
         // "tmp_avatar_" 
         // + String.valueOf(System 
         // .currentTimeMillis()) 
         // + ".jpg")); 
         Log.i("TAG", "Final path" + path); 
         try { 
          if (file.exists() == false) { 
           file.getParentFile().mkdirs(); 
           file.createNewFile(); 
          } 

         } catch (IOException e) { 
          Log.e("TAG", "Could not create file.", e); 
         } 
         mImageCaptureUri = Uri.fromFile(file); 
         intent.putExtra(
           android.provider.MediaStore.EXTRA_OUTPUT, 
           mImageCaptureUri); 
         // } else { 
         // intent.putExtra(
         // android.provider.MediaStore.EXTRA_OUTPUT, 
         // android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
         // } 

         try { 
          // intent.putExtra("return-data", true); 
          startActivityForResult(intent, PICK_FROM_CAMERA); 
         } catch (ActivityNotFoundException e) { 
          e.printStackTrace(); 
         } 
        } else { 
         new AlertDialog.Builder(MainActivity.this) 
           .setMessage(
             "External Storeage (SD Card) is required.\n\nCurrent state: " 
               + storageState) 
           .setCancelable(true).create().show(); 
        } 

       } else { // pick from file 
        Intent intent = new Intent(); 

        intent.setType("image/*"); 
        intent.setAction(Intent.ACTION_GET_CONTENT); 

        startActivityForResult(Intent.createChooser(intent, 
          "Complete action using"), PICK_FROM_FILE); 
       } 
      } 
     }); 

     final AlertDialog dialog = builder.create(); 

     Button button = (Button) findViewById(R.id.btn_crop); 
     mImageView = (ImageView) findViewById(R.id.iv_photo); 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       dialog.show(); 
      } 
     }); 
    } 

    public boolean hasImageCaptureBug() { 

     // list of known devices that have the bug 
     ArrayList<String> devices = new ArrayList<String>(); 
     devices.add("android-devphone1/dream_devphone/dream"); 
     devices.add("generic/sdk/generic"); 
     devices.add("vodafone/vfpioneer/sapphire"); 
     devices.add("tmobile/kila/dream"); 
     devices.add("verizon/voles/sholes"); 
     devices.add("google_ion/google_ion/sapphire"); 

     return devices.contains(android.os.Build.BRAND + "/" 
       + android.os.Build.PRODUCT + "/" + android.os.Build.DEVICE); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (resultCode != RESULT_OK) 
      return; 

     switch (requestCode) { 
     case PICK_FROM_CAMERA: 
      Log.i("TAG", "Inside PICK_FROM_CAMERA"); 
      // mImageCaptureUri = data.getData(); 
      // Bitmap bm1 = (Bitmap) data.getExtras().get("data"); 
      // mImageView.setImageBitmap(bm1); 
      // Bundle extras1 = data.getExtras(); 
      // Bitmap bm1 = (Bitmap) extras1.get("data"); 
      // mImageView.setImageBitmap(bm1); 

      /* 
      * try { if (hasImageCaptureBug()) { Log.i("TAG", "Inside Bug"); 
      * selectedImagePath = String.valueOf(System .currentTimeMillis()) + 
      * ".jpg"; File fi = new File(
      * Environment.getExternalStorageDirectory(), selectedImagePath); 
      * try { mImageCaptureUri = Uri 
      * .parse(android.provider.MediaStore.Images.Media 
      * .insertImage(getContentResolver(), fi.getAbsolutePath(), null, 
      * null)); if (!fi.delete()) { Log.i("logMarker", 
      * "Failed to delete " + fi); } } catch (FileNotFoundException e) { 
      * e.printStackTrace(); } } else { mImageCaptureUri = 
      * data.getData(); } } catch (Exception e) { Log.i("TAG", 
      * "Inside Bug"); selectedImagePath = 
      * String.valueOf(System.currentTimeMillis()) + ".jpg"; File fi = 
      * new File(Environment.getExternalStorageDirectory(), 
      * selectedImagePath); try { mImageCaptureUri = Uri 
      * .parse(android.provider.MediaStore.Images.Media 
      * .insertImage(getContentResolver(), fi.getAbsolutePath(), null, 
      * null)); if (!fi.delete()) { Log.i("logMarker", 
      * "Failed to delete " + fi); } } catch (FileNotFoundException e1) { 
      * e1.printStackTrace(); } } 
      */ 

      String path = mImageCaptureUri.getPath(); 
      Log.i("TAG", 
        "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!After capture path " 
          + path); 

      doCrop(); 

      break; 

     case PICK_FROM_FILE: 
      mImageCaptureUri = data.getData(); 
      Log.i("TAG", 
        "After Crop mImageCaptureUri " + mImageCaptureUri.getPath()); 
      GallaryPhotoSelected = true; 
      doCrop(); 

      break; 

     case CROP_FROM_CAMERA: 
      Bundle extras = data.getExtras(); 

      selectedImagePath = mImageCaptureUri.getPath(); 

      Log.i("TAG", "After Crop selectedImagePath " + selectedImagePath); 

      if (GallaryPhotoSelected) { 
       selectedImagePath = getRealPathFromURI(mImageCaptureUri); 
       Log.i("TAG", "Absolute Path " + selectedImagePath); 
       GallaryPhotoSelected = true; 
      } 

      Finalmedia = selectedImagePath; 

      if (extras != null) { 
       // Bitmap photo = extras.getParcelable("data"); 
       Log.i("TAG", "Inside Extra " + selectedImagePath); 
       Bitmap photo = (Bitmap) extras.get("data"); 

       selectedImagePath = String.valueOf(System.currentTimeMillis()) 
         + ".jpg"; 

       Log.i("TAG", "new selectedImagePath before file " 
         + selectedImagePath); 

       File file = new File(Environment.getExternalStorageDirectory(), 
         selectedImagePath); 

       try { 
        file.createNewFile(); 
        FileOutputStream fos = new FileOutputStream(file); 
        photo.compress(Bitmap.CompressFormat.PNG, 95, fos); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        Toast.makeText(this, 
          "Sorry, Camera Crashed-Please Report as Crash A.", 
          Toast.LENGTH_LONG).show(); 
       } 

       selectedImagePath = Environment.getExternalStorageDirectory() 
         + "/" + selectedImagePath; 
       Log.i("TAG", "After File Created " + selectedImagePath); 

       Bitmap bm = decodeFile(selectedImagePath); 
       mImageView.setImageBitmap(bm); 
      } 

      /* 
      * File f = new File(mImageCaptureUri.getPath()); 
      * 
      * if (f.exists()) f.delete(); 
      */ 

      break; 

     } 
    } 

    public static Bitmap decodeFile(String path) { 
     int orientation; 
     try { 
      if (path == null) { 
       return null; 
      } 
      // decode image size 
      BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      // Find the correct scale value. It should be the power of 2. 
      final int REQUIRED_SIZE = 70; 
      int width_tmp = o.outWidth, height_tmp = o.outHeight; 
      int scale = 1; 
      // while (true) { 
      // if (width_tmp/2 < REQUIRED_SIZE 
      // || height_tmp/2 < REQUIRED_SIZE) 
      // break; 
      // width_tmp /= 2; 
      // height_tmp /= 2; 
      // scale++; 
      // } 
      // decode with inSampleSize 
      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize = scale; 
      Bitmap bm = BitmapFactory.decodeFile(path, o2); 
      Bitmap bitmap = bm; 

      ExifInterface exif = new ExifInterface(path); 

      orientation = exif 
        .getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 

      Log.e("ExifInteface .........", "rotation =" + orientation); 

      // exif.setAttribute(ExifInterface.ORIENTATION_ROTATE_90, 90); 

      Log.e("orientation", "" + orientation); 
      Matrix m = new Matrix(); 

      if ((orientation == ExifInterface.ORIENTATION_ROTATE_180)) { 
       m.postRotate(180); 
       // m.postScale((float) bm.getWidth(), (float) bm.getHeight()); 
       // if(m.preRotate(90)){ 
       Log.e("in orientation", "" + orientation); 
       bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
         bm.getHeight(), m, true); 
       return bitmap; 
      } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { 
       m.postRotate(90); 
       Log.e("in orientation", "" + orientation); 
       bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
         bm.getHeight(), m, true); 
       return bitmap; 
      } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { 
       m.postRotate(270); 
       Log.e("in orientation", "" + orientation); 
       bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), 
         bm.getHeight(), m, true); 
       return bitmap; 
      } 
      return bitmap; 
     } catch (Exception e) { 
      return null; 
     } 

    } 

    public String getRealPathFromURI(Uri contentUri) { 
     String[] proj = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = managedQuery(contentUri, proj, null, null, null); 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 

    private void doCrop() { 
     final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>(); 

     Intent intent = new Intent("com.android.camera.action.CROP"); 
     intent.setType("image/*"); 

     List<ResolveInfo> list = getPackageManager().queryIntentActivities(
       intent, 0); 

     int size = list.size(); 

     if (size == 0) { 
      Toast.makeText(this, "Can not find image crop app", 
        Toast.LENGTH_SHORT).show(); 

      return; 
     } else { 

      intent.setData(mImageCaptureUri); 
      intent.setClassName("com.android.camera", 
        "com.android.camera.CropImage"); 
      intent.putExtra("outputX", 100); 
      intent.putExtra("outputY", 100); 
      intent.putExtra("aspectX", 1); 
      intent.putExtra("aspectY", 1); 
      intent.putExtra("scale", true); 
      intent.putExtra("return-data", true); 
      // startActivityForResult(intent, CROP_FROM_CAMERA); 

      if (size == 1) { 
       Intent i = new Intent(intent); 
       ResolveInfo res = list.get(0); 

       i.setComponent(new ComponentName(res.activityInfo.packageName, 
         res.activityInfo.name)); 

       startActivityForResult(i, CROP_FROM_CAMERA); 
      } else { 
       for (ResolveInfo res : list) { 
        final CropOption co = new CropOption(); 

        co.title = getPackageManager().getApplicationLabel(
          res.activityInfo.applicationInfo); 
        co.icon = getPackageManager().getApplicationIcon(
          res.activityInfo.applicationInfo); 
        co.appIntent = new Intent(intent); 

        co.appIntent 
          .setComponent(new ComponentName(
            res.activityInfo.packageName, 
            res.activityInfo.name)); 

        cropOptions.add(co); 
       } 

       CropOptionAdapter adapter = new CropOptionAdapter(
         getApplicationContext(), cropOptions); 

       AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setTitle("Choose Crop App"); 
       builder.setAdapter(adapter, 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, int item) { 
           startActivityForResult(
             cropOptions.get(item).appIntent, 
             CROP_FROM_CAMERA); 
          } 
         }); 

       builder.setOnCancelListener(new DialogInterface.OnCancelListener() { 
        @Override 
        public void onCancel(DialogInterface dialog) { 

         if (mImageCaptureUri != null) { 
          getContentResolver().delete(mImageCaptureUri, null, 
            null); 
          mImageCaptureUri = null; 
         } 
        } 
       }); 

       AlertDialog alert = builder.create(); 

       alert.show(); 
      } 
     } 
    } 
}