在Android中按比例裁剪图片

4

我使用这段代码启动裁剪活动,并在onActivityResult中获取裁剪后的图片数据。所以这个功能运行良好。

    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.putExtra("outputX", 200);
        intent.putExtra("outputY", 200);
        intent.putExtra("scale", true);
        intent.putExtra("return-data", true);

        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);

这是将图像裁剪为200x200的代码,无论我在裁剪活动中选择哪个宽高比。我的担忧是,我希望使用矩形框选择的宽高比,而不是通过输入数字200和200来固定宽高比。
但是当我注释掉这两行代码时,我的程序会强制关闭...
有没有什么解决方案可以精确裁剪我在裁剪活动中选择的图片部分,并保持放置在图片上的矩形的宽高比?哪些数据需要作为额外内容传递?需要帮助!
4个回答

2

这就是关键所在,我想要一个矩形,但我不希望图片在200x200之后适应尺寸...因此宽高比不是我选择的,图片会变形。 - MischaelKuhr

1

只需添加以下代码行以设置宽高比为0.75

intent.putExtra("aspectX", 3);
intent.putExtra("aspectY", 4);

并将比例设置为true

这应该解决问题。


1
很难解释!我不想固定宽高比,我希望用户能够自由选择矩形的大小,而不是通过设置宽高比或像素来预定义。只需打开活动而不设置aspectX/Y或outputX/Y。 - MischaelKuhr

0

可能有点晚回答了,考虑到其他人可能会带着同样的问题来到这个线程。

cropIntent.putExtra("aspectX", 1);
cropIntent.putExtra("aspectY", 1);

将确保您始终获得一个矩形。


对我没用。只使用了裁剪、缩放和这两个,但它不起作用。 - makkasi

0
从图库选择一张图片并保持想要的纵横比进行裁剪。在本例中,该比例为BANNER_WIDTH_PX:BANNER_HEIGHT_PX。
protected static final int REQ_CODE_PICK_BANNER = 2; //identificador del inten
private static final int BANNER_WIDTH_PX = 640;
private static final int BANNER_HEIGHT_PX =244;

   protected void startSelectorBanner(){
        Intent photoPickerIntent = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            photoPickerIntent.setType("image/*");
            photoPickerIntent.putExtra("crop", "true");
             photoPickerIntent.putExtra("aspectX",BANNER_WIDTH_PX);  
             photoPickerIntent.putExtra("aspectY",BANNER_HEIGHT_PX);  
             photoPickerIntent.putExtra("outputX",BANNER_WIDTH_PX);  
             photoPickerIntent.putExtra("outputY",BANNER_HEIGHT_PX);  
            photoPickerIntent.putExtra("return-data", true);
            photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
            startActivityForResult(photoPickerIntent, REQ_CODE_PICK_BANNER);        
  }


public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {

            getMainActivity().removeOnActivityResultsListeners(EditQcardFragment.this); 

            switch (requestCode) {
               case REQ_CODE_PICK_BANNER:
                    if (resultCode == Activity.RESULT_OK) {  
                        if (imageReturnedIntent!=null) {
                            Bundle extras = imageReturnedIntent.getExtras();          
                            Bitmap selectedBitmap = extras.getParcelable("data");
                            int[] screenSize = Screen.getSize(getActivity()); 
                            int bannerX = screenSize[0]; 
                            int bannerY = (int) (screenSize[0]/BANNER_RATIO);  

                            Bitmap resizedBitmap = processPicture(selectedBitmap,"banner.png",bannerX,bannerY);
                            mBytesBanner = getPictureBytes("banner.png", resizedBitmap); 
                            log.debug("Get png width: " + mBytesBanner.length);
                            if(mBytesBanner!=null){
                                  mBanner.setImageBitmap(resizedBitmap);
                            }

                        }
                    }break; 
            }       
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接