我爱编程

调用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;

}
上一篇下一篇

猜你喜欢

热点阅读