1. 程式人生 > >使用Android系統呼叫裁剪圖片並儲存

使用Android系統呼叫裁剪圖片並儲存

順序:開啟圖片--->獲取圖片Uri或者Bitmap--->開啟系統裁剪框--->獲得裁剪後的圖片的Uri或者Bitmap。

1.單純開啟相簿選擇圖片

Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);// 開啟相簿獲取圖片
intent.setAction(Intent.ACTION_PICK);// 開啟相簿獲取圖片
intent.setType("image/*");// 這個引數是確定要選擇的內容為圖片
intent.putExtra("return-data", true);// 是否要返回,如果設定false取到的值就是空值
startActivityForResult(intent, REQUEST);


1.1選擇圖片並顯示在ImageView

Uri selectImg = data.getData();
ContentResolver contentResolver = this.getContentResolver();
try {
bm = BitmapFactory.decodeStream(contentResolver.openInputStream(selectImg));
normal_img.setImageBitmap(bm);
} catch (FileNotFoundException e) {
e.printStackTrace();
}


1.2拍照圖片

File cameraFile = new File(Environment.getExternalStorageDirectory().getPath(),"abc.jpg");
if (cameraFile.exists()) {
cameraFile.delete();
}
Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent2.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile));
startActivityForResult(intent2, TAKE_PICTURE);


2.選擇相簿裡的圖片進行裁剪

Intent antent = new Intent(Intent.ACTION_PICK, null);
antent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");//限制圖片型別,可寫"image/jpg"或"image/png"

//MediaStore.Images.Media.EXTERNAL_CONTENT_URI意思是返回的資料型別是圖片對應的Uri,不是將Bitmap直接返回。如果直接返回Bitmap,如果Bitmap太大,系統會強行壓縮造成圖片的失真,所以不管圖片大小,最好返回資料都用Uri
startActivityForResult(antent, CUT_REQUEST);

2.1呼叫裁剪框返回資料為Bimap

/**
* 以時間戳命名將bitmap寫入檔案
* 
* @param bitmap
*/
public static void writeFileByBitmap2(Bitmap bitmap) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath();//手機設定的儲存位置
File file = new File(path);
File imageFile = new File(file, System.currentTimeMillis() + ".png");


if (!file.exists()) {
file.mkdirs();
}
try {
imageFile.createNewFile();
FileOutputStream outputStream = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
outputStream.flush();
outputStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

2.1呼叫裁剪框返回資料為Uri

/**
* 以時間戳命名將bitmap寫入檔案
* 
* @param bitmap
*/
public static void writeFileByBitmap2(Bitmap bitmap) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath();//手機設定的儲存位置
File file = new File(path);
File imageFile = new File(file, System.currentTimeMillis() + ".png");


if (!file.exists()) {
file.mkdirs();
}
try {
imageFile.createNewFile();
FileOutputStream outputStream = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
outputStream.flush();
outputStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


3儲存圖片

/**
* 以時間戳命名將bitmap寫入檔案
* 
* @param bitmap
*/
public static void writeFileByBitmap2(Bitmap bitmap) {
String path = Environment.getExternalStorageDirectory().getAbsolutePath();//手機設定的儲存位置
File file = new File(path);
File imageFile = new File(file, System.currentTimeMillis() + ".png");


if (!file.exists()) {
file.mkdirs();
}
try {
imageFile.createNewFile();
FileOutputStream outputStream = new FileOutputStream(imageFile);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
outputStream.flush();
outputStream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


注意:裁剪或者選擇圖片,最好返回資料的格式是Uri!!!