最近項目中使用系統(tǒng)相機拍照,保存圖片炭序,發(fā)現(xiàn)一些問題啤覆。
(1)小米手機拍照圖片會旋轉
??讀取圖片旋轉角度,然后再旋轉回去惭聂。
/**
* 讀取照片旋轉角度
*
* @param path 照片路徑
* @return 角度
*/
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/**
* 旋轉圖片
*
* @param angle 被旋轉角度
* @param bitmap 圖片對象
* @return 旋轉后的圖片
*/
public static Bitmap rotatingImageView(int angle, Bitmap bitmap) {
Bitmap returnBm = null;
// 根據(jù)旋轉角度窗声,生成旋轉矩陣
Matrix matrix = new Matrix();
matrix.postScale(-1,1);
matrix.postRotate(angle);
try {
// 將原始圖片按照旋轉矩陣進行旋轉,并得到新的圖片
returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
} catch (OutOfMemoryError e) {
LogUtil.e(e.getMessage());
} catch (Exception e) {
LogUtil.e(e.getMessage());
}
if (returnBm == null) {
returnBm = bitmap;
}
if (bitmap != returnBm) {
bitmap.recycle();
}
return returnBm;
}
(2)讀取圖片是否為 .gif 圖片
?? 使用BitmapFactory.Options辜纲,能更準確的獲取圖片格式笨觅,
???判斷地址末尾 .gif 有時候會不準確(不推薦)
//區(qū)分是不是.gif
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
if ("image/gif".equals(options.outMimeType)) {
imgPath = EditPhotSDCardUtil.getPictureDir() + pathName + "~";
} else {
imgPath = EditPhotSDCardUtil.getPictureDir() + pathName + "-";
}
(3)上傳圖片到服務器,防止圖片會被刪除地址無效
??上傳服務器耕腾,一般使用地址见剩,但是用戶手動刪除圖片后,地址是無效的扫俺。為了防止地址無效苍苞,可以對需要上傳圖片地址做保存,但又希望系統(tǒng)讀取不到牵舵,可以對保存地址進行修改柒啤。
String SDCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator;
String imageCacheUrl = SDCardRoot + "APP_NAME" + File.separator;
File file = new File(imageCacheUrl);
if (!file.exists()) {
file.mkdirs(); //如果不存在則創(chuàng)建
}
//區(qū)分 .gif,為了展示不同UI
if ("image/gif".equals(options.outMimeType)) {
imgPath = imageCacheUrl + "文件名"+ "~";
} else {
imgPath = imageCacheUrl + "文件名" + "-";
}
(4)調用系統(tǒng)相機畸颅,拍照后保存圖片担巩,會出現(xiàn)2張,而且只能讀取到一張没炒。
??讀取圖片地址api
final String[] IMAGE_PROJECTION = {
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATE_ADDED,
MediaStore.Images.Media._ID,
MediaStore.Images.Media.MINI_THUMB_MAGIC,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
//讀取相冊圖片地址
Cursor mCursor = mContentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
IMAGE_PROJECTION,
null,
null,
IMAGE_PROJECTION[2] + " DESC");
第一個問題涛癌,為什么會出現(xiàn)2張。
??我們可以去系統(tǒng)相冊查看兩張圖片,會發(fā)現(xiàn)兩張圖片的地址是不一樣的拳话,而且兩張圖片的大小也不同先匪。
出現(xiàn)2張的原因是:
?(1)調用系統(tǒng)相機,拍照完成我們會生成一個保存地址弃衍,而這個地址是: /storage/android/data/包名/Picture/ 呀非,這張是我們保存的拍照圖片。
?(2)相同的一張圖片在哪镜盯?這個地址是:/storage/Pictures/ 岸裙,這張圖片是系統(tǒng)復制的App目錄下Pictures中的圖片。
??所以就會出現(xiàn)在系統(tǒng)相冊兩張圖片速缆,但兩張圖片大小不一致降允,地址不同。
第二個問題艺糜,為什么只能讀取到一張剧董,是哪一張?
??調用系統(tǒng)api窘俺,只能讀取到一張衅澈,是系統(tǒng)復制的那張跌榔,也就是 /storage/Pictures/ 目錄下的這張迹冤,但是/storage/android/data/包名/Picture/ 目錄下的沒有讀取到六荒。
解決辦法
??知道了問題舔箭,就有解決辦法啊央,可分為三種方法:
?(1)第一種方法:
?????保存圖片的時候缔赠,修改下地址(可參照標題 3 晤碘,這樣讓系統(tǒng)無法識別出這張圖片)褂微,結果就是,我讀取不到园爷,系統(tǒng)也別想讀取不到宠蚂,在系統(tǒng)相冊里也就看不到這張圖片。
?(2)第二種方法:
?????因為api無法讀取到童社,那我們就直接再讀取/storage/android/data/包名/Picture/ 下的文件求厕,把圖片一塊加入到同一個集合中用于展示,這樣所有的圖片都有了扰楼,但是系統(tǒng)相冊中還是有兩張圖片呀癣,為解決這個問題。
?(3)第三種方法:()
?????在我們保存圖片的時候弦赖,直接保存到 /storage/Pictures/ 這個目錄下项栏,也不用系統(tǒng)幫我們復制了,這樣就只會出現(xiàn)一張蹬竖,而且我們也能調用api直接讀取到沼沈,兩個問題全都解決了流酬,完美!
//不要這樣保存
//File storageDir = mContext.getExternalFilesDir(Environment.DIRECTORY_PICTURES);~~
//保存圖片的時候列另,直接保存到/storage/Pictures/
File storageDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "Pictures");
?
?
(如果以上有錯誤或者有更優(yōu)美的方式芽腾,感謝指出并改之,與君共勉)
這是我項目中出現(xiàn)的問題页衙,希望能夠幫助到你摊滔,Thanks,Bye!