调用android系统的图片裁剪方式问题和解决方式
2018-04-16 本文已影响100人
许先森的许
调用android系统的图片裁剪方式问题和解决方式:
如果你的程序中使用的图片裁剪方式是这样子的话:
1、调用系统自带的图片裁剪页面,吧图片保存在inetnt中;
/**
* 收缩图片
*
* @param uri
*/
public static void startPhotoZoom(Activity activity, Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");//调用Android系统自带的一个图片剪裁页面,
intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
intent.putExtra("crop", "true");//进行修剪
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
activity.startActivityForResult(intent, PHOTO_RESOULT);
}
2、裁剪完毕通过intentData取出图片
Bundle extras = data.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
如果使用这种方式,就会遇到一个问题:
在某些手机(本人遇到的情况是小米3)上面无法跳转到系统的图片裁剪页面,或者IntentData是null。
这种方式是把图片放在intent中传递,而intent在安卓中的定义是传递轻量级的数据,显然传递图片是不合适的,高性能的手机可能没问题,性能差点的手机就会出问题了。、
解决方式:
1、用intent传递图片的Uri:
private staticUrimUriFile;
/**
* 收缩图片
*
* @param uri
*/
public static void startPhotoZoom(Activity activity, Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");//调用Android系统自带的一个图片剪裁页面,
intent.setDataAndType(uri, IMAGE_UNSPECIFIED);
intent.putExtra("crop", "true");//进行修剪
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
//原来默认裁剪图片数值是300,直接上传小米3手机接口返回上传图片太大,其他手机都可以,当在裁剪的时候手动缩小框框就变小了。。。
intent.putExtra("outputX", 150);
intent.putExtra("outputY", 150);
//uritempFile为Uri类变量,实例化uritempFile
mUriFile = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory() + "/tmp.jpg");
intent.putExtra(MediaStore.EXTRA_OUTPUT, mUriFile);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("return-data", false);
// intent.putExtra("return-data", true);
//原来用intent上面方式传图片是不合理的,intent传的都是轻量级的,传图片这种大数据就不合适了,小米3就没法跳转到剪切页面
activity.startActivityForResult(intent, PHOTO_RESOULT);
}
2、裁剪完毕通过Uri取出图片:
public staticBitmapgetBitmapFromUri(Uri uri,Activity activity) {
try{
//读取uri所在的图片
Bitmap bitmap =
ImageUtil.getThumbnail(activity,uri,UIUtils.dip2px(activity,480),UIUtils.dip2px(activity,800));
// MediaStore.Images.Media.getBitmap(activity.getContentResolver(), uri);
returnbitmap;
}catch(Exception e) {
e.printStackTrace();
return null;
}
}
这里要注意取图片的方式,小心oom。把规避oom的方式也贴出来:
/**
* 根据本地图片的Uri,和制定的图片的宽度和高度,拿到图片,防止通过系统拿图片会出现OOM的情况
*
*@parammContext
*@paramuri
*@paramreqWidth
*@paramreqHeight
*@return
*@throwsIOException
*/
public staticBitmapgetThumbnail(Activity mContext,Uri uri, intreqWidth, intreqHeight)throwsIOException {
InputStream input = mContext.getContentResolver().openInputStream(uri);
BitmapFactory.Options options =newBitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeStream(input, null,options);
if((options.outWidth== -1) || (options.outHeight== -1))
return null;
options.inSampleSize=calculateInSampleSize(options,reqWidth,reqHeight);
options.inJustDecodeBounds=false;
input.close();
input = mContext.getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(input, null,options);
input.close();
returnbitmap;
}