Android使用Fresco之下載圖片(包括GIF圖)
Fresco相信大家都不陌生,是個很不錯的圖片載入器
最近做的需求有檢視大圖儲存圖片,儲存圖片很簡單,但是儲存gif圖就需要處理一下了。
之前google了好久,也沒有找到靠譜的答案,(還是API看的不夠仔細 ~)
原理在Fresco 資料來源和資料訂閱者
因為是檢視大圖的時候儲存圖片,所以其實沒有必要非從網路去下載圖片了,記憶體or磁碟中可能已經有快取,再去網路下載,顯然是浪費使用者的流量,所以我是這樣做的。。。
情況一:
如果你的應用只有靜態圖片,那麼
DataSource<CloseableReference<CloseableImage>> dataSource1 = imagePipeline.fetchDecodedImage(imageRequest, null);dataSource1.subscribe(new BaseBitmapDataSubscriber() { @Override protected void onNewResultImpl(Bitmap bitmap) { //get bitmap } @Override protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) { }}, CallerThreadExecutor.getInstance());
情況二:
如果你的應用有靜態圖片也有動態圖片(GIF)
DataSource> dataSource =
imagePipeline.fetchEncodedImage(imageRequest, null);
dataSource.subscribe(newBaseDataSubscriber>() {
@Override
protected voidonNewResultImpl(DataSource> dataSource) {
if(!dataSource.isFinished()) {
saveFail();
return;
}
CloseableReference ref = dataSource.getResult();
if(ref !=null) {
try{
PooledByteBuffer result = ref.get();
InputStream is =newPooledByteBufferInputStream(result);
try{
ByteArrayOutputStream bos =newByteArrayOutputStream(1000);
byte[] b =new byte[1000];
intn;
while((n = is.read(b)) != -1) {
bos.write(b,0,n);
}
is.close();
bos.close();
savePic(url,bos.toByteArray());//通過byte檔案頭,判斷是否是gif,再做相應的命名處理
}catch(Exception e) {
}finally{
Closeables.closeQuietly(is);
}
}finally{
CloseableReference.closeSafely(ref);
ref =null;
}
}
}
@Override
protected voidonFailureImpl(DataSource> dataSource) {
saveFail();
}
},CallerThreadExecutor.getInstance());
總結
現在開源專案特別多,大家也都儘可能的不去重複造輪子,但是使用一個好的開源框架,最好還是瞭解一下原始碼的實現,這樣在使用的過程中,遇到的任何問題,都有解釋的依據。
情況一中,對圖片做了解碼處理,如果不想要解碼,直接使用情況二的方式也是可以的。
上圖中的null
是什麼鬼
其實是需要傳遞的是context但是我們看原始碼
發現我們在呼叫設定圖片是,底層傳遞的就是null,所以為了避免我們的context被無法控制的第三方框架一直引用而引發記憶體洩露,我們這裡還是不要把context傳遞過去了(畢竟不傳,也沒發現什麼問題),至於為什麼會有這個引數,還是要多看原始碼分析了。
-
儲存到系統相簿的問題
前面的儲存,我們是儲存到sd卡中我們自己的目錄,但是如果要儲存到系統相簿,大部分使用的方式:
File file =newFile(filePath);
String uri =null;
String systemFilepath = filePath;
try{
uri = MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(),"","");
systemFilepath =getFilePathByContentResolver(context,Uri.parse(uri));
MediaScannerConnection.scanFile(context, newString[]{systemFilepath}, null, null);
FileHelper.DataDir.deleteFileOrDir(file);
returnsystemFilepath;
}catch(Throwable e) {
}
這裡有個問題,看原始碼
系統預設儲存的是jpeg格式,這樣如果儲存GIF圖就悲劇了。。。
開始我是想,拿到系統相簿路徑,手動儲存,但是有兩個問題
1、系統相簿路徑如何獲取(不同rom儲存的位置都不一樣)
2、自己儲存,縮圖怎麼生成(系統儲存到相簿的的insertImage預設會儲存一份縮圖)
目前這塊我還沒找到更好的方式處理,找到後一定要記錄下來。。。
好了,我去寫程式碼了。。。
相關文章
- Android圖片載入框架Fresco使用詳解Android框架
- Android圖片載入的框架Fresco使用詳解Android框架
- FaceBook推出的Android圖片載入庫FrescoAndroid
- Android圖片載入開源庫深度推薦,安利FrescoAndroid
- Fresco圖片載入的簡單應用
- 載入GIF圖片優化方案優化
- 初識Facebook的強大Android圖片載入的框架:FrescoAndroid框架
- 影片直播原始碼,載入gif圖片原始碼
- Glide載入gif圖片優化IDE優化
- Android兩種簡單的載入GIF圖片的方法Android
- 【學習圖片】05:GIF
- 記一次Fresco載入圖片失敗的分析
- Android播放Gif動態圖片的幾種方法Android
- Android 載入大圖片,不壓縮圖片Android
- Android 圖片載入框架Android框架
- android 載入大量圖片Android
- GifCam,Gif動態圖片截圖小軟體
- Swift 專案總結 08 GIF 圖片載入優化Swift優化
- ARKit 如何給SCNNode貼Gif圖片CNN
- Android 高效安全載入圖片Android
- android選擇圖片或拍照圖片上傳到伺服器(包括上傳引數)Android伺服器
- iOS 關於 GIF 圖片那點事iOS
- 自動釋放記憶體!Facebook推出強大Android圖片庫Fresco記憶體Android
- AlamofireImage 使用 – swift載入網路圖片,縮放圖片,生成圓形圖片Swift
- HTML使用canvas載入圖片HTMLCanvas
- Android原始碼閱讀——GIF解碼(如何提取各幀圖片)Android原始碼
- Android 載入網路圖片 以及實現圓角圖片效果Android
- android glide圖片載入框架AndroidIDE框架
- Android9.0使用Glide載入圖片問題AndroidIDE
- android-smart-image-view圖片載入簡單使用AndroidView
- Android使用LruCache、DiskLruCache實現圖片快取+圖片瀑布流Android快取
- 要優雅!Android中這樣載入大圖片和長圖片Android
- Android 超高仿微信圖片選擇器 圖片該這麼載入Android
- 使用httpclient下載 頁面、圖片HTTPclient
- Android 高清載入巨圖方案 拒絕壓縮圖片Android
- Android 基礎之圖片載入(二)Android
- Android偽圖片載入進度效果Android
- [開源]基於WPF實現的Gif圖片分割器,提取GIf圖片中的每一幀