图片工具类,照相,相册,剪裁,uri转换为string地址,缩放图片

创建的一个工具类

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.v4.app.Fragment;

/**
 * Created by Administrator on 2016/7/9.
 */
public class ImageUtils {
    private static final int ww = 480;
    private static final int hh = 800;
    //单例模式
    private ImageUtils() {
    }
    private static ImageUtils instance = null;
    public static ImageUtils getInstance(){
        if (instance == null) {
            instance = new ImageUtils();
        }
        return instance;
    }
    //判断调用者是Fragment还是Activity
    private void startActivityForResult(Object object,int requestCode,Intent intent){
        if(object instanceof Fragment){
            Fragment fragment=(Fragment)object;
            fragment.startActivityForResult(intent, requestCode);
        }else if(object instanceof Activity){
            Activity activity=(Activity)object;
            activity.startActivityForResult(intent, requestCode);
        }
    }
    //调用系统相机
    public void getCameraPic(Uri uri,Object object) {
        Intent intent = new Intent();
        intent.setAction("android.media.action.IMAGE_CAPTURE");
        intent.addCategory("android.intent.category.DEFAULT");
        // 照完照片后要保存起来,
        // 先获取外部储存卡的路径
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        startActivityForResult(object,Consts.CAMEAR_REQUEST,intent);
    }
    //调用本地相册
    public void getFilePic(Object object){
        Intent intent = new Intent();
        intent.setAction("android.intent.action.PICK");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.setType("image/*");
        startActivityForResult(object,Consts.OPEN_PHOTO,intent);
    }
    //调用系统截取图片的方法
    public void crop(Uri uri,Object object) {
        Intent intent = new Intent();
        intent.setAction("com.android.camera.action.CROP");
        intent.addCategory("android.intent.category.DEFAULT");
        intent.setDataAndType(uri, "image/*");
        // 是否要裁剪
        intent.putExtra("crop", true);
        // x和y的宽高比
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        // 宽和高的像素
        intent.putExtra("outputX", 250);
        intent.putExtra("outputY", 250);
        // 裁剪后的照片格式
        intent.putExtra("outputFormat", "JPEG");
        // 是否返回
        intent.putExtra("return-data", true);
        //因为需要裁剪后的照片,所以需要返回结果
        startActivityForResult(object,Consts.CROP_PIC,intent);
    }

    //通过路径获取bitmap,并进行缩放
    public Bitmap pathToBitmap(String filePath) {
        if (filePath == null) {
            return null;
        }
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        Bitmap bitmap = BitmapFactory.decodeFile(filePath, options);
        int width = options.outWidth;
        int height = options.outHeight;
        float scale = 1f;
        if (width > ww && width > height) {
            scale = width / ww;
        } else if (height > hh && height > width) {
            scale = height / hh;
        } else {
            scale = 1;
        }

        options.inSampleSize = (int) scale;
        options.inJustDecodeBounds = false;
        bitmap = BitmapFactory.decodeFile(filePath, options);
        return bitmap;
    }

    //uri转换为String地址
    public static String uriToRealPath(Context context, Uri uri) {
        Cursor cursor = context.getContentResolver().query(uri,
                new String[]{MediaStore.Images.Media.DATA},
                null,
                null,
                null);
        cursor.moveToFirst();
        String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
        return path;
    }
}

可以用Activity调用也可以用Fragment的调用

★★★注意在Fragment使用onActivityResult的方法的时候,要使用fragment.startActivityForResult(),不能使用activity,不然回传的时候接受不到值

这里使用的是Fragment,有两个地方进行请求,一个剪裁(flag==0),一个不剪裁(flag==1)
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //相机传来的消息
        if (requestCode == Consts.CAMEAR_REQUEST) {
            if(flag==0){
            //进行剪裁
                imageUtils.crop(Uri.fromFile(saveFile),Fragment_me.this);
            }else if(flag==1){
            //为图片设置背景,讲将图片的地址转换为Bitmap并进行转缩放
                meRelTitlebg.setBackground(new BitmapDrawable(imageUtils.pathToBitmap(saveFile.getPath())));
            }
        }
        //剪裁图片
        else if (requestCode == Consts.CROP_PIC) {
            if(data!=null){
                Bitmap bitmap = data.getParcelableExtra("data");
                meIcon.setImageBitmap(bitmap);
            }
        }
        //打开本地图册回传的消息
        else if (requestCode == Consts.OPEN_PHOTO) {
            if(data!=null){
                if(flag==0){
                //获取照相的图片路径
                    Uri uri=data.getData();
                    imageUtils.crop(uri,Fragment_me.this);
                }else if(flag==1){
                    Uri uri=data.getData();
                    try {
                    //通过uri获取图片路径
                        String path = imageUtils.uriToRealPath(activity, uri);
                        meRelTitlebg.setBackground(new BitmapDrawable(imageUtils.pathToBitmap(path)));
                        //drawable解析uri转换为Drawable对象
//meRelTitlebg.setBackground(Drawable.createFromStream(activity.getContentResolver().openInputStream(uri),null));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值