Android-->相册,摄像头获取图片,图片路径,以及剪裁图片

本文介绍如何从相册,摄像头中获取图片Bitmap和图片的路径Path.
并且实现可以剪裁图片,和压缩图片.

1:打开图片选择器(系统默认就提供了)

static final int REQUEST_CODE_PHOTO = 100;
public void getPhotoFromPhotos() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "选择图片"), REQUEST_CODE_PHOTO);
}

2:打开相机拍照图片

static final int REQUEST_CODE_CAMERA = 101;
public void getPhotoFromCamera() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
    imageUri = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),
            UUID.randomUUID() + ".jpg"));//需要提供图片的保存路径
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); // set the image file name
    startActivityForResult(intent, REQUEST_CODE_CAMERA);
}

3:通过图片路径剪裁图片

/**
 * 用给定的uri,调用 裁剪程序
 */
private void cropImageByUri(Uri uri, int outputX, int outputY, int requestCode) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 2);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", outputX);
    intent.putExtra("outputY", outputY);
    intent.putExtra("scale", true);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    intent.putExtra("return-data", false);
    intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
    intent.putExtra("noFaceDetection", true); // no face detection
    startActivityForResult(intent, requestCode);
}

4:处理返回的data数据

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_PHOTO && data != null) {
            imageUri = data.getData();
            if (imageUri != null) {//相册选择
                 //todo
            } else {//拍照选择,不能设置MediaStore.EXTRA_OUTPUT
                Bundle extras = data.getExtras();
                //todo
            }
        } else if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_CAMERA && imageUri != null) {//拍照选择,设置MediaStore.EXTRA_OUTPUT
              //todo
        } else if (resultCode == RESULT_OK && requestCode == 130 && imageUri != null) {//拍照选择,设置MediaStore.EXTRA_OUTPUT
           //todo
        }
    }

5:从uri中获取bitmap对象

private Bitmap getImage(Uri imageUri) {
  return MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
 }

6:从uri中获取path路径

 public static String getPathFromUri(@NonNull Context context, @NonNull Uri uri) {
     String path = "";
     if (uri.getScheme().equalsIgnoreCase(ContentResolver.SCHEME_CONTENT)) {
         Cursor cursor;
         final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
         if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
             String wholeID = DocumentsContract.getDocumentId(uri);
             String id = wholeID.split(":")[1];
             String[] column = {MediaStore.Images.Media.DATA};
             String sel = MediaStore.Images.Media._ID + "=?";
             cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column,
                     sel, new String[]{id}, null);
             int columnIndex = cursor.getColumnIndex(column[0]);
             if (cursor.moveToFirst()) {
                 path = cursor.getString(columnIndex);
             }
             cursor.close();
         } else {
             String[] projection = {MediaStore.Images.Media.DATA};
             cursor = context.getContentResolver().query(uri, projection, null, null, null);
             int column_index = cursor.getColumnIndexOrThrow(projection[0]);
             cursor.moveToFirst();
             path = cursor.getString(column_index);
             cursor.close();
         }
     } else if (uri.getScheme().equalsIgnoreCase(ContentResolver.SCHEME_FILE)) {
         path = uri.getPath();
     }
     return path;
 }

7:图片压缩,缩放

/**
 * scale image
 *
 * @param org
 * @param newWidth
 * @param newHeight
 * @return
 */
public static Bitmap scaleImageTo(Bitmap org, int newWidth, int newHeight) {
    float scaleWidth = (float) newWidth / org.getWidth();
    float scaleHeight = (float) newHeight / org.getHeight();
    float scale = Math.max(scaleWidth, scaleHeight);
    return scaleImage(org, scale, scale);
}

/**
 * scale image
 *
 * @param org
 * @param scaleWidth  sacle of width
 * @param scaleHeight scale of height
 * @return
 */
public static Bitmap scaleImage(Bitmap org, float scaleWidth, float scaleHeight) {
    if (org == null) {
        return null;
    }
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    return Bitmap.createBitmap(org, 0, 0, org.getWidth(), org.getHeight(), matrix, true);
}

public static int calculateInSampleSize(BitmapFactory.Options options,
                                        int reqWidth, int reqHeight) {
    // 源图片的高度和宽度
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;
    if (height > reqHeight || width > reqWidth) {
        // 计算出实际宽高和目标宽高的比率
        final int heightRatio = Math.round((float) height / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);
        // 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高
        // 一定都会大于等于目标的宽和高。
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }
    return inSampleSize;
}

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
                                                     int reqWidth, int reqHeight) {
    // 第一次解析将inJustDecodeBounds设置为true,来获取图片大小
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    // 调用上面定义的方法计算inSampleSize值
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    // 使用获取到的inSampleSize值再次解析图片
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

源码: https://github.com/angcyo/PhotoGetDemo


至此: 文章就结束了,如有疑问: QQ群 Android:274306954 欢迎您的加入.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,874评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,151评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,270评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,137评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,116评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,935评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,261评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,895评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,342评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,854评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,978评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,609评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,181评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,182评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,402评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,376评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,677评论 2 344

推荐阅读更多精彩内容