【问题标题】:Cropping Pictures in Android by keeping Aspect Ratio通过保持纵横比在 Android 中裁剪图片
【发布时间】:2012-05-14 06:29:42
【问题描述】:

我使用此代码启动裁剪活动,并将裁剪后的图片作为 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 来固定。

但是当我注释掉这两行时,我的程序会强制关闭....

是否有任何解决方案可以精确地裁剪到我在裁剪活动中选择的图片部分,同时保持我放置在图片上的矩形的纵横比? 我必须添加哪些数据作为额外数据?需要帮助!

【问题讨论】:

    标签: android image crop


    【解决方案1】:

    How to crop a rectangle from an image in android

    无法裁剪为方形以外的任何形状 内置 Android 裁剪处理 (com.android.camera.action.CROP)。

    在下一个帖子中查看 OP 的回复 - 你可能会有解决方案。

    这个帖子也有一些不错的建议:

    【讨论】:

    • 这就是重点,我想要一个矩形,但我不希望图片适合之后的大小为 200x200 .... 所以纵横比不是我选择的那样,图片会失真。
    【解决方案2】:

    只需添加以下代码行以获取纵横比0.75

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

    并将比例设置为true

    这应该可以解决问题。

    【讨论】:

    • 我很难解释!我不想修复纵横比,我希望用户能够选择他想要的矩形,而不是通过设置纵横比或像素来预先定义....只是,打开活动而不设置纵横比 X/Y或输出X/Y
    【解决方案3】:

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

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

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

    【讨论】:

    • 对我不起作用。只使用了裁剪、缩放和这两​​个,但它不起作用
    【解决方案4】:

    从图库中选择图像并裁剪以保持所需的纵横比。在这种情况下,比率为 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; 
                }       
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 2016-03-26
      相关资源
      最近更新 更多