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

Posted

技术标签:

【中文标题】使用“com.android.camera.action.CROP”意图裁剪图像,在某些设备上返回小尺寸位图【英文标题】:Using "com.android.camera.action.CROP" Intent to crop images, returns small size bitmaps on some devices 【发布时间】:2016-12-27 00:07:54 【问题描述】:

我正在使用“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 到底是做什么的,但是改变它们并不能解决我的问题。

【问题讨论】:

“虽然在大多数设备上,它都非常好用”——您在数千种 Android 设备型号中测试过多少?毕竟,Android itself does not have a CROP Intent,虽然少数设备确实可以。请使用an image-cropping library。 【参考方案1】:

不,Android 没有有裁剪意图

许多开发者在 Intent 上调用 startActivity(),动作为 com.android.camera.action.CROP。他们这样做是为了裁剪图像。

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

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


解决方案

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

以下是一些需要考虑的库:

android-crop Image crop-Image crop-Image (forked from the above one) pick-n-crop

希望这能解决您的问题。

【讨论】:

这基本上是这篇文章的复制和粘贴 - commonsware.com/blog/2013/01/23/…

以上是关于使用“com.android.camera.action.CROP”意图裁剪图像,在某些设备上返回小尺寸位图的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)