美文网首页我爱编程
调用android系统的图片裁剪方式问题和解决方式

调用android系统的图片裁剪方式问题和解决方式

作者: 许先森的许 | 来源:发表于2018-04-16 16:27 被阅读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;
    
    }

    相关文章

      网友评论

        本文标题:调用android系统的图片裁剪方式问题和解决方式

        本文链接:https://www.haomeiwen.com/subject/diyekftx.html