Android圖片處理:識別影象方向並顯示
在Android中使用ImageView顯示圖片的時候發現圖片顯示不正,方向偏了或者倒過來了。
解決這個問題很自然想到的分兩步走:
1、自動識別影象方向,計算旋轉角度;
2、對影象進行旋轉並顯示。
一、識別影象方向
首先在這裡提一個概念EXIF(Exchangeable Image File Format,可交換影象檔案),具體解釋參見Wiki。
簡而言之,Exif是一個標準,用於電子照相機(也包括手機、掃描器等)上,用來規範圖片、聲音、視屏以及它們的一些輔助標記格式。
Exif支援的格式如下:
影象
壓縮影象檔案:JPEG、DCT
非壓縮影象檔案:TIFF
不支援:JPEG 2000、PNG、GIF
音訊
RIFF、WAV
Android提供了對JPEG格式影象Exif介面支援,可以讀取JPEG檔案metadata資訊,參見ExifInterface.
這些Metadata資訊總的來說大致分為三類:日期時間、空間資訊(經緯度、高度)、Camera資訊(孔徑、焦距、旋轉角、曝光量等等)。
二、影象旋轉
Android中提供了對Bitmap進行矩陣旋轉的操作,參見Bitmap提供的靜態createBitmap方法.
public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
Added in API level 1Returns an immutable bitmap from subset of the source bitmap, transformed by the optional matrix. The new bitmap may be the same object as source, or a copy may have been made. It is initialized with the same density as the original bitmap. If the source bitmap is immutable and the requested subset is the same as the source bitmap itself, then the source bitmap is returned and no new bitmap is created.
Parameters
source The bitmap we are subsetting x The x coordinate of the first pixel in source y The y coordinate of the first pixel in source width The number of pixels in each row height The number of rows m Optional matrix to be applied to the pixels filter true if the source should be filtered. Only applies if the matrix contains more than just translation. Throws
IllegalArgumentException if the x, y, width, height values are outside of the dimensions of the source bitmap.
到此這兩個問題理論上都解決了,開始實際操作一下吧,參照以下程式碼。
- public class IOHelper {
- ......
- /** 從給定路徑載入圖片*/
- public static Bitmap loadBitmap(String imgpath) {
- return BitmapFactory.decodeFile(imgpath);
- }
- /** 從給定的路徑載入圖片,並指定是否自動旋轉方向*/
- public static Bitmap loadBitmap(String imgpath, boolean adjustOritation) {
- if (!adjustOritation) {
- return loadBitmap(imgpath);
- } else {
- Bitmap bm = loadBitmap(imgpath);
- int digree = 0;
- ExifInterface exif = null;
- try {
- exif = new ExifInterface(imgpath);
- } catch (IOException e) {
- e.printStackTrace();
- exif = null;
- }
- if (exif != null) {
- // 讀取圖片中相機方向資訊
- int ori = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
- ExifInterface.ORIENTATION_UNDEFINED);
- // 計算旋轉角度
- switch (ori) {
- case ExifInterface.ORIENTATION_ROTATE_90:
- digree = 90;
- break;
- case ExifInterface.ORIENTATION_ROTATE_180:
- digree = 180;
- break;
- case ExifInterface.ORIENTATION_ROTATE_270:
- digree = 270;
- break;
- default:
- digree = 0;
- break;
- }
- }
- if (digree != 0) {
- // 旋轉圖片
- Matrix m = new Matrix();
- m.postRotate(digree);
- bm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(),
- bm.getHeight(), m, true);
- }
- return bm;
- }
- }
- ......
- }
相關文章
- opencv圖片處理與OCR識別OpenCV
- 顯示網路圖片變形的處理
- iPhone中XML處理以及網路上的圖片顯示iPhoneXML
- 從YYImage原始碼中學習如何處理圖片顯示原始碼
- Android圖片處理(Matrix,ColorMatrix)AndroidColorMatrix
- Android 圖片快取處理Android快取
- android 圓角圖片 處理Android
- Android 圖片高斯模糊處理Android
- Android 開源圖片裁剪工具、圖片顯示工具分享Android
- QLabel顯示圖片 ,並實現縮放
- 妙招:使用Python實現圖片在人臉識別並顯示Python
- Qt for Android (三) 開啟Android相簿並選一個圖片進行顯示QTAndroid
- android圖片處理,讓圖片變成圓形Android
- Android ImageView 圖片靠右,靠左處理AndroidView
- Android 介面顯示與邏輯處理Android
- img圖片無法顯示利用onerror事件顯示替代圖片Error事件
- 黑洞圖片的背後,是影象處理技術的成熟!
- 影象識別及處理相關資料集介紹
- python圖片處理類之~PIL.Image模組(ios android icon圖示自動生成處理)PythoniOSAndroid
- Django實現圖片上傳並前端頁面顯示Django前端
- 瀏覽器更新HTTP伺服器圖片並顯示瀏覽器HTTP伺服器
- AXIOS從伺服器載入圖片並顯示iOS伺服器
- 第四章 載入並顯示PNG圖片
- Android中顯示html標籤或者帶圖片AndroidHTML
- 使用jpeg圖片庫,顯示圖片並簡單實現LCD的觸屏功能
- [Python影象處理] 一.影象處理基礎知識及OpenCV入門函式PythonOpenCV函式
- iOS 影象處理 - 影象拼接iOS
- 利用 JS 進行圖片處理並生成對應粒子圖JS
- webpack圖片處理Web
- Thumbnailator處理圖片AI
- iOS 圖片處理iOS
- 圖片上傳及圖片處理
- Android中呼叫攝像頭拍照儲存,並在相簿中選擇圖片顯示Android
- Java——圖片滾動顯示Java
- 呼叫系統檔案管理器選擇圖片,呼叫系統裁剪AIP對圖片處理,顯示裁剪之後的圖片...AI
- Android用ImageView顯示本地和網上的圖片AndroidView
- 影象處理之影象增強
- opencv圖片上如何顯示兩個小圖片OpenCV