1. 程式人生 > >Android裁剪圖片總結

Android裁剪圖片總結

在網上搜索了Android裁剪圖片的方式,發現有兩種:

1、裁剪後返回的不是Intent中指定尺寸的圖,而是縮圖

2、裁剪後返回的是指定大小的圖片

關於這兩種裁剪方式,我把自己試驗後的結果記錄如下:

1、裁剪成縮圖模式,步驟如下:

(1)先通過Intent選擇圖片,獲取圖片URI,程式碼如下:

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, 300);
(2)在onActivityResult中獲取選中的圖片的URI,程式碼如下:
Uri uri = data.getData();
(3)獲取URI之後,通過Intent裁剪圖片,程式碼如下:
private void cropImage(Uri uri) {
    if(uri == null){
        return;
    }
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("outputX", 500);
    intent.putExtra("outputY", 500);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, 100);
}
(4)在onActivityResult中接收返回的裁剪後的bitmap,程式碼如下:
Bitmap bm = data.getParcelableExtra("data");
if(bm != null){
    imageView.setImageBitmap(bm);
}else{
    Toast.makeText(this, "bitmap == null", Toast.LENGTH_SHORT).show();
}
上面的4步就是裁剪圖片返回縮圖的程式碼,雖然在第三步中,我們在Intent中指定了outputX和outputY的值為500,但是在第四步中返回的bitmap的寬高卻不一定是500,我在魅族魅藍note(系統是Android4.4)上測試,結果返回的bitmap長寬都是177,但是在Android模擬器(系統是Android5.1)上測試,返回的確是我們指定的大小。

2、裁剪圖片返回指定的大小而不是縮圖

這種裁剪方法的思路是,通過URI將裁剪的圖片按我們指定的大小儲存到檔案中,步驟如下:

(1)用Intent選擇圖片,程式碼如下:

Intent intent = new Intent(Intent.ACTION_PICK, null);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, REQ_CODE_SELECT_PIC);
(2)在onActivityResult中獲取選擇的圖片的URI,程式碼如下:
Uri uri = data.getData();
(3)開始裁剪圖片,並將裁剪後的資料儲存到檔案中,程式碼如下:
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// 下面這個crop=true是設定在開啟的Intent中設定顯示的VIEW可裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是寬高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪圖片寬高
intent.putExtra("outputX", 600);
intent.putExtra("outputY", 600);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
startActivityForResult(intent, REQ_CODE_CROP);
上面的程式碼需要注意的是,return-data我們設定了false,表示裁剪後的圖片不用bitmap的形式返回,而是通過URI存到檔案中,另外,intent中給MediaStore.EXTRA_OUTPUT屬性設定了一個tempUri,這個URI就代表裁剪後的圖片儲存的檔案,tempUri的初始化程式碼如下:
tempFile = new File(tempDir + File.separator + System.currentTimeMillis() + ".jpg");
tempUri = Uri.fromFile(tempFile);
(4)在onActivityResult中處理資料。經過第三步之後,裁剪完成的圖片就儲存到tempUri對應的檔案中了,這個檔案裡的圖片,是按照我們設定的裁剪大小儲存的,而不是縮圖的形式,所以我們顯示裁剪後的圖片,就可以直接從檔案裡讀取資料了,onActivityResult中的程式碼如下所示:
Bitmap bm = BitmapFactory.decodeFile(tempFile.getAbsolutePath());
imageView.setImageBitmap(bm);
其中的tempFile,是在初始化tempUri的時候新建的檔案

3、裁剪圖片的demo

根據前面記錄的兩種裁剪圖片的方式,我寫了一個demo,效果圖如下:

      

        

在我的魅族魅藍note上測試,是沒有問題的,其他機型和系統沒測試,結果可能會有出入。

原始碼放在下面了,是AndroidStudio工程。