Android本地圖片選擇并裁剪工具類

lai123 8年前發布 | 5K 次閱讀 Java Android

[Java]代碼    

import java.io.FileNotFoundException;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;

/**
 * 選擇本地圖片工具類
 * <br>
 * 因為直接獲取圖片容易崩潰,所以直接存入SD卡,再獲取
 * <br>
 * 又因為寫法不正確容易導致部分機型無法使用,所以封裝起來復用
 * <br>
 * 使用方法:
 * <br>
 * 1、調用getByAlbum、getByCamera去獲取圖片
 * <br>
 * 2、在onActivityResult中調用本工具類的onActivityResult方法進行處理
 * <br>
 * 3、onActivityResult返回的Bitmap記得空指針判斷
 * 
 * <br><br>
 * PS:本工具類只能處理裁剪圖片,如果不想裁剪,不使用本工具類的onActivityResult,自己做處理即可
 * 
 * @author linin630
 *
 */
public class SelectPicUtil {

    /**臨時存放圖片的地址,如需修改,請記得創建該路徑下的文件夾*/
    private static final String lsimg = "file:///sdcard/temp.jpg";

    public static final int GET_BY_ALBUM = 801;//如果有沖突,記得修改
    public static final int GET_BY_CAMERA = 802;//如果有沖突,記得修改
    public static final int CROP = 803;//如果有沖突,記得修改

    /**從相冊獲取圖片*/
    public static void getByAlbum(Activity act){
        Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);
        getAlbum.setType("image/*");
        act.startActivityForResult(getAlbum, GET_BY_ALBUM);
    }

    /**通過拍照獲取圖片*/
    public static void getByCamera(Activity act){
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)) {
            Intent getImageByCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.parse(lsimg));
            getImageByCamera.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);
            act.startActivityForResult(getImageByCamera, GET_BY_CAMERA);
        } else {
            L.e("請確認已經插入SD卡");
        }
    }
    /**
     * 處理獲取的圖片,注意判斷空指針,默認大小480*480,比例1:1
     */
    public static Bitmap onActivityResult(Activity act, int requestCode, int resultCode, Intent data){
        return onActivityResult(act, requestCode, resultCode, data, 0, 0, 0, 0);
    }
    /**
     * 處理獲取的圖片,注意判斷空指針
     */
    public static Bitmap onActivityResult(Activity act, int requestCode, int resultCode, Intent data, 
            int w, int h,int aspectX,int aspectY){
        Bitmap bm = null;
        if (resultCode == Activity.RESULT_OK) {
            Uri uri = null;
            switch (requestCode) {
            case GET_BY_ALBUM:
                uri = data.getData();
                act.startActivityForResult(crop(uri,w,h,aspectX,aspectY),CROP);
                break;
            case GET_BY_CAMERA:
                uri = Uri.parse(lsimg);
                act.startActivityForResult(crop(uri,w,h,aspectX,aspectY),CROP);
                break;
            case CROP:
                bm = dealCrop(act);
                break;
            }
        }
        return bm;
    }

    /**默認裁剪輸出480*480,比例1:1*/
    public static Intent crop(Uri uri){
        return crop(uri,480,480,1,1);
    }
    /**
     * 裁剪,例如:輸出100*100大小的圖片,寬高比例是1:1
     * @param w 輸出寬
     * @param h 輸出高
     * @param aspectX 寬比例
     * @param aspectY 高比例
     */
    public static Intent crop(Uri uri,int w,int h,int aspectX,int aspectY){
        if (w==0&&h==0) {
            w=h=480;
        }
        if (aspectX==0&&aspectY==0) {
            aspectX=aspectY=1;
        }
        Intent intent = new Intent("com.android.camera.action.CROP");
        // 照片URL地址
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", aspectX);
        intent.putExtra("aspectY", aspectY);
        intent.putExtra("outputX", w);
        intent.putExtra("outputY", h);
        // 輸出路徑
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.parse(lsimg));
        // 輸出格式
        intent.putExtra("outputFormat", "JPEG");
        // 不啟用人臉識別
        intent.putExtra("noFaceDetection", true);
        intent.putExtra("return-data", false);
        return intent;
    }

    /**處理裁剪,獲取裁剪后的圖片*/
    public static Bitmap dealCrop(Context context){
        // 裁剪返回
        Uri uri = Uri.parse(lsimg);
        Bitmap bitmap = null;
        try {
            bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return bitmap;
    }

}
 本文由用戶 lai123 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!