1. 程式人生 > >史上最強Android 開啟照相或者是從本地相簿選中一張圖片以後先裁剪在儲存並顯示的講解附原始碼i

史上最強Android 開啟照相或者是從本地相簿選中一張圖片以後先裁剪在儲存並顯示的講解附原始碼i

整個程式的佈局很簡單

只在一個垂直方向上的線性佈局裡面有倆個按鈕(Button)和一個顯示圖片的控制元件(ImageView)
這裡就不給出這部分的程式碼了

1.是開啟系統的相簿

Intent albumIntent = new Intent(Intent.ACTION_PICK, null);
albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(albumIntent, ALBUM_OK);
這裡是通過啟動一個系統的隱式意圖開啟的本地相簿
2.是開啟系統的拍照
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
// 下面這句指定呼叫相機拍照後的照片儲存的路徑
if (pre.exists()) {
    pre.delete();
}
try {
    pre.createNewFile();
} catch (IOException e) {
    e.printStackTrace();
}
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(pre));
startActivityForResult(cameraIntent, CAMERA_OK
);
通過開啟一個隱式意圖開啟照相機
3.進行裁剪 這裡的裁剪也是通過一個隱式意圖呼叫系統的功能的
/**
 * 裁剪圖片方法實現
 *
 * @param uri 圖片來源
 */
public void clipPhoto(Uri uri) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");
    // aspectX aspectY 是寬高的比例,這裡設定的是正方形(長寬比為1:1)
intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪圖片寬高 intent.putExtra("outputX", 300); intent.putExtra("outputY", 300); intent.putExtra("return-data", true); startActivityForResult(intent, CUT_OK); }

4.顯示、儲存圖片
/**
 * 儲存裁剪之後的圖片資料 將圖片設定到imageview中
 *
 * @param picdata
*/
private void setPicToView(Intent picdata) {
    CLog.d(TAG, "將圖片顯示在控制元件上");
    Bundle extras = picdata.getExtras();
    if (extras != null) {
        bitmap = extras.getParcelable("data");
        // TODO 設定圖片之前 應該將之前的圖片刪除,將最新的圖片儲存
readBitmap2File(bitmap);
        headPhoto.setImageBitmap(bitmap);
    }
}

下面附上整個程式的原始碼(其中還包括一個隊圖片進行二次取樣的工具類)
這裡面有一個問題有待驗證。
在儲存圖片的時候,當時我的做法是先判斷SDCard卡是否可用,
不可用的情況直接儲存到手機記憶體,在這個地方,有人和我提到過好像由於某些問題,是不能儲存到這個地方的。
可用的情況下,直接就在SDCard卡中儲存。