使用“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 aCROP
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有三种方式(不使用,动态使用,静态使用,默认是动态使用)