【问题标题】:Crop does not work for gallery images裁剪不适用于图库图像
【发布时间】:2015-09-07 17:27:23
【问题描述】:

我正在使用以下代码从相机和图库中裁剪图像:

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, getApplicationContext().getString(R.string.crop_unavailable), Toast.LENGTH_SHORT).show();
        // return
    } else {
        intent.setData(mImageCaptureUri);
        int y = 200;
        if(lastSelect == 1 || lastSelect == 2 || lastSelect == 3 || lastSelect == 4){
            y = (int) (200 * 0.5697329376854599);
        }
        intent.putExtra("outputX", 200);
        intent.putExtra("outputY", y);
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);

        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(getApplicationContext().getString(R.string.select_crop_app));
            builder.setAdapter(adapter, new DialogInterface.OnClickListener() {

                @Override
                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();
        }
    }
}

虽然它可以很好地从相机中裁剪图片,但它不适用于图库图片。它总是返回从图库中选择的基本图片。

onActivityResult

if (resultCode != RESULT_OK)
            return;
        switch (requestCode) {
            case PICK_FROM_CAMERA:
                doCrop();
                break;
            case PICK_FROM_FILE:
                mImageCaptureUri = data.getData();
                doCrop();
                break;
            case CROP_FROM_CAMERA:
                Bundle extras = data.getExtras();
                if (extras != null) {
                    photo = extras.getParcelable("data");
//                    imgImage4.setImageBitmap(photo);
                    int w = (int) (UIHelpers.width * 0.15);
                    File f = new File(mImageCaptureUri.getPath());
                    if (f.exists()) {
                    // f.delete();
                    }
                    String imageDir = getRealPathFromURI(mImageCaptureUri);
                            txtSelectLogoNj.setVisibility(View.GONE);
                            rlLogoNj.setVisibility(View.VISIBLE);
                            image5 = imageDir;
                            App.sharedpreferences = getSharedPreferences(App.MyPREFERENCES, Context.MODE_PRIVATE);
                            App.editor = App.sharedpreferences.edit();
                            App.editor.putString("IMAGE5", imageDir);
                            App.editor.commit();
                    }
                }
                break;
        }

我该如何解决?

【问题讨论】:

    标签: android image crop


    【解决方案1】:

    请使用库项目来裁剪图像形式的相机或画廊。 完美它会起作用的。

    https://github.com/biokys/cropimage

    【讨论】:

      【解决方案2】:

      试试这个工作代码

      按钮点击拍照

      dialog.show();
      

      在 Oncreate() 中添加这个

      captureImageInitialization();
      

      试试这个就行了

      // for camera
      
          private void captureImageInitialization() {
              try {
                  /**
                   * a selector dialog to display two image source options, from
                   * camera ‘Take from camera’ and from existing files ‘Select from
                   * gallery’
                   */
                  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) {
                              /**
                               * To take a photo from camera, pass intent action
                               * ‘MediaStore.ACTION_IMAGE_CAPTURE‘ to open the camera
                               * app.
                               */
                              Intent intent = new Intent(
                                      MediaStore.ACTION_IMAGE_CAPTURE);
      
                              /**
                               * Also specify the Uri to save the image on specified
                               * path and file name. Note that this Uri variable also
                               * used by gallery app to hold the selected image path.
                               */
                              mImageCaptureUri = Uri.fromFile(new File(Environment
                                      .getExternalStorageDirectory(), "tmp_avatar_"
                                      + String.valueOf(System.currentTimeMillis())
                                      + ".jpg"));
      
                              intent.putExtra(
                                      android.provider.MediaStore.EXTRA_OUTPUT,
                                      mImageCaptureUri);
      
                              try {
                                  intent.putExtra("return-data", true);
                                  // intent.putExtra("return-data1", true);
      
                                  startActivityForResult(intent, PICK_FROM_CAMERA);
                                  // finish();
                              } catch (ActivityNotFoundException e) {
                                  e.printStackTrace();
                              } catch (Exception e) {
                                  e.printStackTrace();
                              }
      
                          } else {
                              // pick from file
                              /**
                               * To select an image from existing files, use
                               * Intent.createChooser to open image chooser. Android
                               * will automatically display a list of supported
                               * applications, such as image gallery or file manager.
                               */
                              /*
                               * Intent intent = new Intent();
                               * 
                               * intent.setType("image/*");
                               * intent.setAction(Intent.ACTION_GET_CONTENT);
                               * 
                               * startActivityForResult(Intent.createChooser(intent,
                               * "Complete action using"), PICK_FROM_FILE);
                               */
      
                              try {
      
      
                                  Intent intent = new Intent();
                                  intent = new Intent(Intent.ACTION_PICK);
                                  intent.setType("*/*");
                                  intent.putExtra(
                                          android.provider.MediaStore.EXTRA_OUTPUT,
                                          mImageCaptureUri);
                                  startActivityForResult(Intent.createChooser(intent,
                                          "Complete action using"), PICK_FROM_FILE);
                              } catch (Exception e) {
                                  e.printStackTrace();
                              }
      
                          }
                      }
                  });
      
                  dialog = builder.create();
      
              } catch (Exception e) {
      
                  e.printStackTrace();
      
              } catch (OutOfMemoryError o) {
                  o.printStackTrace();
              }
      
          }
      
          public class CropOptionAdapter extends ArrayAdapter<CropOption> {
      
              private ArrayList<CropOption> mOptions;
              private LayoutInflater mInflater;
      
              public CropOptionAdapter(Context context, ArrayList<CropOption> options) {
                  super(context, R.layout.crop_selector, options);
      
                  mOptions = options;
      
                  mInflater = LayoutInflater.from(context);
              }
      
              @Override
              public View getView(int position, View convertView, ViewGroup group) {
                  // new try
                  try {
      
                      if (convertView == null)
                          convertView = mInflater.inflate(R.layout.crop_selector,
                                  null);
      
                      CropOption item = mOptions.get(position);
      
                      if (item != null) {
                          ((ImageView) convertView.findViewById(R.id.iv_icon))
                                  .setImageDrawable(item.icon);
                          ((TextView) convertView.findViewById(R.id.tv_name))
                                  .setText(item.title);
      
                          return convertView;
                      }
      
                      return null;
      
                  } catch (Exception e) {
      
                      e.printStackTrace();
      
                  }
      
                  if (convertView == null)
                      convertView = mInflater.inflate(R.layout.crop_selector, null);
      
                  CropOption item = mOptions.get(position);
      
                  if (item != null) {
                      ((ImageView) convertView.findViewById(R.id.iv_icon))
                              .setImageDrawable(item.icon);
                      ((TextView) convertView.findViewById(R.id.tv_name))
                              .setText(item.title);
      
                      return convertView;
                  }
      
                  return null;
              }
          }
      
          public class CropOption {
              public CharSequence title;
              public Drawable icon;
              public Intent appIntent;
          }
      
      
      
      // Method for Crop
                  private void doCrop() {
      
                      try {
                          final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();
                          /**
                           * Open image crop app by starting an intent
                           * ‘com.android.camera.action.CROP‘.
                           */
                          Intent intent = new Intent("com.android.camera.action.CROP");
                          intent.setType("image/*");
      
                          /**
                           * Check if there is image cropper app installed.
                           */
                          List<ResolveInfo> list = getPackageManager().queryIntentActivities(
                                  intent, 0);
      
                          int size = list.size();
      
                          /**
                           * If there is no image cropper app, display warning message
                           */
                          if (size == 0) {
      
                              Toast.makeText(this, "Can not find image crop app",
                                      Toast.LENGTH_SHORT).show();
      
                              return;
                          } else {
                              /**
                               * Specify the image path, crop dimension and scale
                               */
                              intent.setData(mImageCaptureUri);
      
                              intent.putExtra("outputX", 300);
                              intent.putExtra("outputY", 300);
                              intent.putExtra("aspectX", 1);
                              intent.putExtra("aspectY", 1);
                              intent.putExtra("scale", true);
                              intent.putExtra("return-data", true);
      
                              /**
                               * There is posibility when more than one image cropper app
                               * exist, so we have to check for it first. If there is only one
                               * app, open then app.
                               */
      
                              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 {
                                  /**
                                   * If there are several app exist, create a custom chooser
                                   * to let user selects the app.
                                   */
                                  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();
                              }
                          }
                      }
      
                      catch (Exception e) {
      
                          Log.e("Error", "ERROR IN CODE:" + e.toString());
      
                          e.printStackTrace();
      
                      }
                  }
      

      onActivityResult :

            if (requestCode == PICK_FROM_CAMERA) {
      
                      doCrop();
      
                  }
          else if (requestCode == PICK_FROM_FILE) {
                      mImageCaptureUri = intent.getData();
      
                      doCrop();
                  }       
      else if (requestCode == CROP_FROM_CAMERA) {
      
                      Bundle extras = intent.getExtras();
                      /**
                       * After cropping the image, get the bitmap of the cropped image and
                       * display it on imageview.
                       */
      
      
                      if (extras != null) {
      
                          Bitmap photo = extras.getParcelable("data");
                          // Camera Output
      
      
      
                              viewImage.setImageBitmap(photo);
      
                              ContextWrapper cw = new ContextWrapper(getApplicationContext());
                              String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
                              String imageFileName = "JPEG_" + timeStamp + "_";
                              File directory1 = cw.getDir("Picture",Context.MODE_PRIVATE);
                              File mypath1 = new File(directory1, imageFileName + ".png");
                              picturepath = mypath1.toString();
      
                              // FileOutputStream fos = null;
                              try {
                                  // fos = openFileOutput(filename, Context.MODE_PRIVATE);
                                  System.out.println("mypath = " + mypath1);
                                  fos = new FileOutputStream(mypath1);
      
                                  // Use the compress method on the BitMap object to write
                                  // image to the OutputStream
                                  photo.compress(Bitmap.CompressFormat.PNG, 100, fos);
      
                                  try {
                                      fos.flush();
                                      fos.close();
      
      
                                  } catch (IOException e1) {
      
                                      e1.printStackTrace();
                                  }
                                  try {
                                      fos.close();
                                  } catch (IOException e) {
      
                                      e.printStackTrace();
                                  }
                              } catch (FileNotFoundException e) {
                                  e.printStackTrace();
                              }
      
      
      
                      }
                  }
      

      【讨论】:

      • onActivityResult 仅 from_camera 和 from_file?最后,doCrop 返回到 PICK_FROM_CAMERA?循环?
      • 等待...这段代码就足够了,试试它在我的应用程序中的工作
      • 好的,但我需要从 Image 获取 URI 并将其传递给 MultiPartEntity 以将文件发送到服务器
      • 位图照片 = extras.getParcelable("data");在这里,您将 Bi​​tmap Convert as Uri 发送到服务器
      • 太小了,只能制作 160x160 图像平板电脑 Samsung Gallexy Tab2 10.1
      【解决方案3】:

      嗨,你可以试试这个,

      @Override
          public void onActivityResult(final int requestCode, int resultCode,
                  Intent data) {
              try {
                  switch (requestCode) {
                  case GALLERY_PIC_REQUEST:
                      if (resultCode == RESULT_OK) {
                          try {
                              picUri = data.getData();
                              System.out.println("Image Path::>  "+picUri.getPath());
                              performCrop();
                          } catch (Exception e) {
                              ShowDialog_Ok("Error", "Couldn't load photo");
                          }
                      }
                      break;
                  case CAMERA_PIC_REQUEST:
                      if (resultCode == RESULT_OK) {
                          try {
                              picUri = data.getData();
                              System.out.println("Image Path::>  "+picUri.getPath());
                              performCrop();
                          } catch (Exception e) {
                              ShowDialog_Ok("Error", "Couldn't load photo");
                          }
                      }
                      break;
                  case CROP_PIC_REQUEST:
                      Bitmap bitmap;
                      String path = "";
                      if (resultCode == RESULT_OK) {
                          String oldPath = fashionlyPreferences.getImagePath();
                          try {
                              picUri = data.getData();
                              path = Helper.GetPathFromURI(context, picUri);
                              bitmap  = BitmapFactory.decodeFile(path);
                              Img_View.setImageBitmap(bitmap);
                          } catch (Exception e) {
                              ShowDialog_Ok("Error", "Couldn't load photo");
                          }
                      }
      
                      break;
                  }
              } catch (Exception e) {
              }
          }
      

      //裁剪函数

      private void performCrop() {
                      // take care of exceptions
                      try {
                          if (picUri!=null) {
                               Intent cropIntent = new Intent("com.android.camera.action.CROP");
                               cropIntent.setDataAndType(picUri, "image/*");
                               cropIntent.putExtra("crop", "true");
                               cropIntent.putExtra("scale", true);
                               cropIntent.putExtra("aspectX", 0);
                               cropIntent.putExtra("aspectY", 0);
                              //cropIntent.putExtra("outputX", 400); 
                              // cropIntent.putExtra("outputY", 400);
                               cropIntent.putExtra("return-data", false);
                               startActivityForResult(cropIntent, CROP_PIC_REQUEST);
                          }
                      }
                      // respond to users whose devices do not support the crop action
                      catch (ActivityNotFoundException anfe) {
                          Toast.makeText(this, "This device doesn't support the crop action!", Toast.LENGTH_SHORT).show();
                      }
               }
      

      【讨论】:

      • 为什么你评论了几行: outputX , outputY 和 return-data 是假的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 2010-09-21
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多