使用“com.android.camera.action.CROP”意图裁剪图像,在某些设备上返回小尺寸位图

时间:2016-12-27 00:07:54

标签: android android-intent crop

我正在使用“com.android.camera.action.CROP”来裁剪来自用户图片库的图片。

裁剪功能:

private void performCrop(String picUri) {
        try {
            Intent cropIntent = new Intent("com.android.camera.action.CROP");

            File f = new File(picUri);
            Uri contentUri = Uri.fromFile(f);

            cropIntent.setDataAndType(contentUri, "image/*");
            cropIntent.putExtra("crop", "false");
            cropIntent.putExtra("aspectX", 1);
            cropIntent.putExtra("aspectY", 1);
            cropIntent.putExtra("outputX", 1024); //512
            cropIntent.putExtra("outputY", 1024); //512

            cropIntent.putExtra("return-data", true);
            startActivityForResult(cropIntent, RESULT_CROP);
        }
        catch (ActivityNotFoundException e) {
            String errorMessage = "your device doesn't support the crop action!";
            Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
            toast.show();
        }
    }

并将结果设置为图像视图:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == GALLERY_ACTIVITY_CODE) {
            if(resultCode == Activity.RESULT_OK){
                picturePath = data.getStringExtra("picturePath");

                //perform Crop on the Image Selected from Gallery
                performCrop(picturePath);
            }
        }

        if (requestCode == RESULT_CROP ) {
            if(resultCode == Activity.RESULT_OK){
                Bundle extras = data.getExtras();
                Bitmap selectedBitmap = extras.getParcelable("data");
                // Set The Bitmap Data To ImageView
                addImageImageView.setImageBitmap(selectedBitmap);
                addImageImageView.setScaleType(ImageView.ScaleType.FIT_XY);
            }
        }
    }

在某些设备上,裁剪操作会返回模糊且小尺寸的图像(例如,4128 * 2322像素图像变为160 * 160像素裁剪图像)。在大多数设备上,它运行良好。我不确定outputX和Y是什么做的,但更改它们并不能解决我的问题。

1 个答案:

答案 0 :(得分:0)

否,Android 没有具有作物意图

许多开发人员正在通过 com.android.camera.action.CROP 操作在Intent上调用 startActivity()。他们正在这样做以裁剪图像。

这是一个非常糟糕的主意。

在这种特定情况下,AOSP Camera应用程序支持此Intent操作。该应用程序并非在所有设备上都存在。缺少此应用程序的设备将不会对此未记录的Intent操作做出响应,并且您的应用程序将崩溃。


解决方案

有几个用于在Android中裁剪图像的开源库。我没有尝试过任何一个,因此无法保证任何工作的良好程度。但是,与依靠任何特定用户设备上可能不存在的应用程序中未记录的Intent操作相比,它们是更安全的选择。

这里有一些库可供考虑:

希望这可以解决您的问题。