Android-->相冊,攝像頭獲取圖片,圖片路徑,以及剪裁圖片

本文介紹如何從相冊,攝像頭中獲取圖片Bitmap和圖片的路徑Path.
并且實(shí)現(xiàn)可以剪裁圖片,和壓縮圖片.

1:打開圖片選擇器(系統(tǒng)默認(rèn)就提供了)

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:打開相機(jī)拍照圖片

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,調(diào)用 裁剪程序
 */
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數(shù)據(jù)

@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 {//拍照選擇,不能設(shè)置MediaStore.EXTRA_OUTPUT
                Bundle extras = data.getExtras();
                //todo
            }
        } else if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_CAMERA && imageUri != null) {//拍照選擇,設(shè)置MediaStore.EXTRA_OUTPUT
              //todo
        } else if (resultCode == RESULT_OK && requestCode == 130 && imageUri != null) {//拍照選擇,設(shè)置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) {
        // 計算出實(shí)際寬高和目標(biāo)寬高的比率
        final int heightRatio = Math.round((float) height / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);
        // 選擇寬和高中最小的比率作為inSampleSize的值,這樣可以保證最終圖片的寬和高
        // 一定都會大于等于目標(biāo)的寬和高。
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }
    return inSampleSize;
}

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
                                                     int reqWidth, int reqHeight) {
    // 第一次解析將inJustDecodeBounds設(shè)置為true,來獲取圖片大小
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    // 調(diào)用上面定義的方法計算inSampleSize值
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
    // 使用獲取到的inSampleSize值再次解析圖片
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

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


至此: 文章就結(jié)束了,如有疑問: QQ群 Android:274306954 歡迎您的加入.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容