Android調(diào)用系統(tǒng)拍照裁剪圖片模糊的解決方法
在Android中,調(diào)用系統(tǒng)相機(jī)拍照時(shí),將會(huì)接收到返回的圖像數(shù)據(jù),但是這些圖片并不是全尺寸的圖像,而是系統(tǒng)給的縮略圖,當(dāng)對拍照的圖片進(jìn)行裁切后顯示時(shí),得到的卻是模糊的圖片。下面針對這個(gè)問題提出解決的方法。
首先,我們知道調(diào)用系統(tǒng)的裁切是通過Intent intent = new Intent(“com.android.camera.action.CROP”);
但是intent到底能夠攜帶哪些數(shù)據(jù)呢,都有什么含義呢,我們可以看到如下:

上面包含了所有可選的操作,其中有一些非常重要的參數(shù)。
intent.putExtra(“return-data”, true):表示裁剪后返回的數(shù)據(jù)為Bitmap,是存在內(nèi)存中的縮略圖,效果模糊。獲取的方式為,在Activity中的onActivityResult方法中:
Bundle bundle = data.getExtras();
Bitmap bitmap = bundle.getParcelable("data");
為了獲取到裁切后的原圖,我們選擇將剪切的圖片保存在本地,然后調(diào)用本地的圖片,并不直接返回Bitmap.
intent.putExtra("return-data", false);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
下面代碼實(shí)現(xiàn)拍照/剪切并進(jìn)行顯示的
public static int TAKE_PHOTO_REQUEST_CODE = 1; //拍照
public static int PHOTO_REQUEST_CUT = 2; //裁切
public static int PHOTO_REQUEST_GALLERY = 3; //相冊
public Uri imageUri;
/**
* 打開相機(jī)拍照
*/
private void takePhotos() {
imageUri = Uri.fromFile(getImageStoragePath(this));
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//指定照片存儲(chǔ)路徑
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent,TAKE_PHOTO_REQUEST_CODE);
}
/**
* 打開相冊選擇圖片
*/
private void choicePicFromAlbum() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
}
/**
* 設(shè)置圖片保存路徑
* @return
*/
private File getImageStoragePath(Context context){
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File file = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES),"temp.jpg");
return file;
}
return null;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == TAKE_PHOTO_REQUEST_CODE){
if (imageUri != null){
startPhotoZoom(imageUri);
}
}else if (requestCode == PHOTO_REQUEST_CUT){
if (imageUri != null) {
Bitmap bitmap = decodeUriBitmap(imageUri);
imageView.setImageBitmap(bitmap);
}
}else if (requestCode == PHOTO_REQUEST_GALLERY){
if (data != null) {
imageUri = data.getData();
Bitmap bitmap = decodeUriBitmap(imageUri);
imageView.setImageBitmap(bitmap);
}
}
}
private Bitmap decodeUriBitmap(Uri uri) {
Bitmap bitmap = null;
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
return bitmap;
}
/**
* 調(diào)用系統(tǒng)裁剪
*
* @param uri
*/
public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop為true是設(shè)置在開啟的intent中設(shè)置顯示的view可以剪裁
intent.putExtra("crop", "true");
intent.putExtra("scale", true);
// aspectX aspectY 是寬高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX,outputY 是剪裁圖片的寬高
intent.putExtra("outputX", 800);
intent.putExtra("outputY", 800);
//設(shè)置了true的話直接返回bitmap,可能會(huì)很占內(nèi)存
intent.putExtra("return-data", false);
//設(shè)置輸出的格式
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
//設(shè)置輸出的地址
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
//不啟用人臉識(shí)別
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, PHOTO_REQUEST_CUT);
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)拍照、選擇圖片并裁剪圖片功能
- Android裁剪圖片為圓形圖片的實(shí)現(xiàn)原理與代碼
- 解決Android從相冊中獲取圖片出錯(cuò)圖片卻無法裁剪問題的方法
- Android實(shí)現(xiàn)從本地圖庫/相機(jī)拍照后裁剪圖片并設(shè)置頭像
- Android 7.0中拍照和圖片裁剪適配的問題詳解
- Android自定義View實(shí)現(xiàn)照片裁剪框與照片裁剪功能
- Android實(shí)現(xiàn)拍照及圖片裁剪(6.0以上權(quán)限處理及7.0以上文件管理)
- Android編程實(shí)現(xiàn)調(diào)用系統(tǒng)圖庫與裁剪圖片功能
- Android拍照或從圖庫選擇圖片并裁剪
- Android實(shí)現(xiàn)裁剪照片功能
相關(guān)文章
Android MarkTipsView文字標(biāo)識(shí)控件使用方法
這篇文章主要為大家詳細(xì)介紹了Android MarkTipsView文字標(biāo)識(shí)控件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04
Android利用WindowManager實(shí)現(xiàn)懸浮窗
這篇文章主要為大家詳細(xì)介紹了Android利用WindowManager實(shí)現(xiàn)懸浮窗效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Android permission denied原因歸納和解決辦法
大家好,本篇文章主要講的是Android permission denied原因歸納和解決辦法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下哦2021-12-12
Android Studio 3.0中mipmap-anydpi-v26是什么東東
在Android Studio 3.0中一旦我們創(chuàng)建了一個(gè)項(xiàng)目,一個(gè)名為mipmap-anydpi-v26自動(dòng)創(chuàng)建的文件夾在res文件夾下。它究竟能干什么?為什么我們需要這個(gè)?我們在開發(fā)時(shí)該如何利用它,下面通過本文給大家介紹下2017-12-12
Android?Compose狀態(tài)改變動(dòng)畫animateXxxAsState使用詳解
這篇文章主要為大家介紹了Android?Compose狀態(tài)改變動(dòng)畫animateXxxAsState使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Kotlin 集合函數(shù)map 和 first 的使用場景分析
Kotlin 提供了許多強(qiáng)大的集合操作函數(shù),其中 map 適用于轉(zhuǎn)換集合,first 適用于獲取符合條件的第一個(gè)元素,這篇文章給大家介紹Kotlin 集合函數(shù):map 和 first 的使用場景,感興趣的朋友一起看看吧2025-04-04
Android中ScrollView嵌套GridView的解決辦法
前些日子在開發(fā)中用到了需要ScrollView嵌套GridView的情況,由于這兩款控件都自帶滾動(dòng)條,當(dāng)他們碰到一起的時(shí)候便會(huì)出問題,即GridView會(huì)顯示不全。下面小編給大家分享下解決方案,需要的朋友可以參考下2017-04-04

