android圖片選擇
❶ android 調用圖庫時怎樣選擇多張照片
步驟1:編寫重定向到圖片庫的代碼
我們需要寫一些Java代碼來處理按鈕的點擊事件,而重定向到圖片庫的代碼如下:
Intent i = new Intent(
Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
注意:這里的RESULT_LOAD_IMAGE是一個整形常量需要傳到startActivityForResult()方法。
步驟2:獲取選中的圖片
一旦選擇了一張圖片,onActivityResult()方法將會被調用。我們需要處理這個方法得到的數據,代碼如下:
1 @Override
2 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
3 super.onActivityResult(requestCode, resultCode, data);
4
5 if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
6 Uri selectedImage = data.getData();
7 String[] filePathColumn = { MediaStore.Images.Media.DATA };
8
9 Cursor cursor = getContentResolver().query(selectedImage,
10 filePathColumn, null, null, null);
11 cursor.moveToFirst();
12 13 int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
14 String picturePath = cursor.getString(columnIndex);
15 cursor.close();
16 }
注意:onActivityResult()方法只有當圖片被選中後才會調用。在這個方法中,我們需要檢查requestCode是否是我們之前傳給startActivityForResult()方法的RESULT_LOAD_IMAGE。
❷ 如何解決Android三星手機從圖庫選擇照片旋轉問題
最近解決了一個令我頭疼好久的問題,就是三星手機拍照圖片旋轉的問題,項目中有上傳圖片的功能,那麼涉及到拍照,從相冊中選擇圖片,別的'手機都ok沒有問題,唯獨三星的手機拍照之後,你會很清楚的看到會把照片旋轉一下,然後你根據路徑找到的圖片就是已經被旋轉的了,解決辦法終於被我找到了。我們可以根據圖片的路徑讀取照片exif(Exchangeable Image File 可交換圖像文件)信息中的旋轉角度,至於這個EXIF可以看一下大牛的文章
Android 下的EXIF
根據調試,可以清楚的發現三星手機拍照的圖片的旋轉角度是90度,而別的手機旋轉角度是0度
看一下代碼:
/** * 讀取照片exif信息中的旋轉角度 * @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; }
那麼我們只需要根據旋轉角度將圖片旋轉過來就OK了
public static Bitmap toturn(Bitmap img){ Matrix matrix = new Matrix(); matrix.postRotate(+90); /*翻轉90度*/ int width = img.getWidth(); int height =img.getHeight(); img = Bitmap.createBitmap(img, 0, 0, width, height, matrix, true); return img; }
輕松解決了,是不是很完美?
以上就是本文的全部內容,希望大家喜歡。
❸ android圖片系列 (2) - 靜態 SVG 圖片
SVG 圖片是一種可支持任意縮放的圖片格式,使用 xml 定義,使用 canvas 中 path 路徑來完成繪制,和我們傳統使用的 BitMap點陣圖有很大的區別。
SVG 在前端早就普及了,在android 中是 google 是在5.0之後開始支穗埋持的,14年出來之後兼容是個大問題,隨著2016.2 V7包 23.2.0版本的發布才算是有個相對完善的兼容使用方案。
SVG 的概念我就不寫了,拿來主義啦,原文: Android Vector曲折的兼容之路
不瞎逼逼,我們先來看一看 android 中的 SVG 矢量圖是個什麼東東
看到沒有,這就是一個 SVG 矢量圖片,就是一個 xml 文件,右邊是預覽,先說下,這東西的好處:縮放不失真,體積小。這一個 SVG 圖片只有970個位元組...強大吧,比 png 格式的圖片強的沒邊了吧,png 我們還得適配,做多套,然後一個一個改名字復制到工程里,有了 SVG 媽媽再也不擔心我們寫作業啦...
這里需要解釋下這里的幾個標簽:
這里有一分詳細的屬性說明:
好了下面開始介紹 SVG 啦
首先,需要講解兩個概念——SVG和Vector。
SVG,即Scalable Vector Graphics 矢量圖,這種圖像格式在前端中已經使用的非常廣泛了
Vector,在Android中指的是Vector Drawable,也就是Android中的矢量圖
因此,可以說Vector就是Android中的SVG實現猜顫螞,因為Android中的Vector並不是支持全部的SVG語法,也沒有必要,因為完整的SVG語法是非常復雜的,但已經支持的SVG語法已經夠用了,特別是Path語法,幾乎是Android中Vector的標配
Android以一種簡化的方式對SVG進行了兼容,這種方式就是通過使用它的Path標簽,通過Path標簽,幾洞消乎可以實現SVG中的其它所有標簽,雖然可能會復雜一點,但這些東西都是可以通過工具來完成的,所以,不用擔心寫起來會很復雜。
Path指令解析如下所示:
支持的指令:
M = moveto(M X,Y) :將畫筆移動到指定的坐標位置
L = lineto(L X,Y) :畫直線到指定的坐標位置
H = horizontal lineto(H X):畫水平線到指定的X坐標位置
V = vertical lineto(V Y):畫垂直線到指定的Y坐標位置
C = curveto(C X1,Y1,X2,Y2,ENDX,ENDY):三次貝賽曲線
S = smooth curveto(S X2,Y2,ENDX,ENDY)
Q = quadratic Belzier curve(Q X,Y,ENDX,ENDY):二次貝賽曲線
T = smooth quadratic Belzier curveto(T ENDX,ENDY):映射
A = elliptical Arc(A RX,RY,XROTATION,FLAG1,FLAG2,X,Y):弧線
Z = closepath():關閉路徑
坐標軸為以(0,0)為中心,X軸水平向右,Y軸水平向下
所有指令大小寫均可。大寫絕對定位,參照全局坐標系;小寫相對定位,參照父容器坐標系
指令和數據間的空格可以省略
同一指令出現多次可以只用一個
注意,』M』處理時,只是移動了畫筆, 沒有畫任何東西。 它也可以在後面給出上同時繪制不連續線。
關於這些語法,開發者需要的並不是全部精通,而是能夠看懂即可,其它的都可以交給工具來實現。
這里有一篇 Android vector標簽 PathData 畫圖超詳解 詳細描述了 SVG 中 path 的繪制
好了概念性的東西說完了,我們來看看
SVG 的使用分2種,一種是靜態 SVG 矢量圖,就是本文的主角,本章節主要談論的東西,另一種是 SVG 矢量動畫,是SVG 的高級應用,是給靜態 SVG 加上objectAnimator 動畫,應用的很廣泛,是實現 android icon 動態交互的核心做法。
上面的SVG 圖大家都看到了,我們就是寫一個 xml 的文件,裡面承載的標簽都是描述如何繪制我們想要的圖案的,畫布大小,顏色,路徑等,然後交給系統去繪制。
現在讓我們來看看 SVG 在 andorid 中如何應用,如何兼容5.0以下版本。
SVG 雖然早早就在前端使用了,但是 android 上開始支持 SVG 的使用還是從5.0開始的,在5.0以上系統的使用很簡單,和之前一樣使用 PNG 圖片一樣
首先 android 中的 SVG 圖片的承載方式是一個 xml 文件,所以UI 給我們的 SVG 圖片是不能直接使用的,這里 google 給我們提供載入方式
Android studio 在 2.3.3 的版本中可以直接使用 svg,新建一個 SVGDemo項目,新建 Vector Asset 文件:app-> main -> New -> Vector Asset 如圖所示:
我們選擇 Local File 就是選擇本地svg文件進行導入,對文件命名後點擊 Next ->Finish 在 drawable目錄 下就添加了一個.xml的文件
好了這樣一個 svg 圖片我們算是加入到我們的工程里里了,可以直接使用了。當然在此之前我們把 SVG 圖片放在那個 drawable 文件夾呢。對於這個問題就要說一下了:
有一點需要解釋一下,svg 矢量圖文件我們放在drawable 根目錄即可。android 系統不會根據你把 svg 矢量圖存放在不同的 drawable 文件夾,對圖片進行解析度上的縮放,因此我們不用像使用 PNG 圖片時准備多套圖片了。我們導入 SVG 圖片默認存放的地址就是 drawable根目錄,所以我們就放這里就好了,當然也可以自己寫SVG 圖片,都是 xml 的,自己寫完 path 路徑後都是可以查看預覽的,一般也不會自己寫,都是UI 的活。
這樣就 ok啦,5.0以上的系統SVG你就像一般 png 圖片一樣使用就好啦,你可以試一下。
SVG 在 4.x 版本上的兼容根據 SVG 使用范圍的變化,配置也是逐步增加的
這時 imageview 就不行了,我們需要使用 AppCompatActivity 或是 AppCompatImageView,這時我們需要導入 V7 包
gradle 需要如下配置:
系統會在 4.x 版本時對 SVG 自動生成相應的 drawable 圖,此時 SVG 是沒有無限拉伸特性的,gradle 的配置目的是去這個
舉個例子:
資源設置不能用 src 了,必須使用 srcCompat ,這時我們能看到圖而不是去 SVG 的特性了
這時上面的設置就不夠了,我們在 view 所在的 activity 或是全局添加下面的設置
然後這還不夠,我們必須給 SVG 圖片添加一個容器,比如 selector,這樣我們才能正常使用,比如給 textview 設置圖片,自定義屬性設置圖片
這個 vc_halfstart_24dp 就是 SVG 圖片
這個我們必須要添加官方的 vectorDrawable 支持庫了,最低支持到 23.2.0
這樣基本就沒啥問題了
SVG 配合自定義 view 的話,就得我們讀取 SVG 然後轉換成 path 路徑來畫了,SVG 實質上也是 xml 文件,所以解析 xml 文件的思路也使用,當然還有其他一些 SVG 轉 path 的思路
SVG前戲—讓你的View多姿多彩 一文中提供了一些思路,大家不妨去看看
❹ Android 圖片選擇(ImageSelector) (拍照,裁剪,壓縮,查看)
1.遍歷sdcard文件夾(指定層次深度 searchDeep ),如果文件夾發現圖片 , 添加到已搜索到圖片的文件列表中,並跳入下一個文件夾搜索
2.使用 ContentResolver 搜索 添加搜索標簽(png,jpg,jpeg,gif 等) 優點:更快速
壓縮調用
第一步-->
采樣率壓縮:設置 BitmapFactory.Options.inSampleSize 大小
第二步-->
PNG:尺寸壓縮( Config:ARGB_4444 ,工具: Canvas );
JPG:尺寸壓縮( Config:ARGB_565 ,工具: Canvas )+壓縮質量( bitmap.compress() )
注 :
1.GIF不做壓縮處理
2.尺寸壓縮:改變寬高(png,jpg)
3.壓縮質量:改變文件大小(適用jpg,png無效)
❺ 【基礎筆記】Android Studio拍照、選擇相冊(第三方框架)
①選擇指定後綴文件
②在圖片選擇器中選擇圖片或視頻
③接受返回的文件
FilePicker
①、添加依賴
②、Activity實現takephoto
③實例圖片
④Git地址
TakePhoto
❻ Android 中實現選擇圖片生成縮略圖點擊查看大圖的功能
基本思路:
就是通過選擇圖片,生成保存好2種圖片,一個是縮略圖,一個是大圖,點擊相對應的圖片,把大圖傳遞過去
大圖容易引用OOM,引用了一個開源庫