UWP開發中兩種網路圖片緩存方法

来源:http://www.cnblogs.com/Yixin-ran/archive/2016/11/16/6068909.html
-Advertisement-
Play Games

通常情況下,我們的程式需要從伺服器讀取圖片,但如果需要不止一次讀取某一張圖片的話,就需要做本地緩存了,這樣既為用戶省一點流量,又能顯得你的APP很快。 假如你已經知道了某一張圖片的地址,那麼第一件事就是要把這張圖片下載下來;當然如果是一次性讀取的話,可以直接把圖片地址給Image控制項或者給Bitma ...


  通常情況下,我們的程式需要從伺服器讀取圖片,但如果需要不止一次讀取某一張圖片的話,就需要做本地緩存了,這樣既為用戶省一點流量,又能顯得你的APP很快。

  假如你已經知道了某一張圖片的地址,那麼第一件事就是要把這張圖片下載下來;當然如果是一次性讀取的話,可以直接把圖片地址給Image控制項或者給Bitmapimage對象(實際上這二者是沒有去別的),但這無法存到本地,只作為顯示用;但是我們要做的是保存到本地,這樣肯定是不行的。現在我們就要用到HTTP的東西了,請看下麵的代碼:

           
 async static public Task<IInputStream> GetStreamAsync(string url)
        {

            httpClient = new HttpClient();
            var response = await httpClient.GetInputStreamAsync(new Uri(url));
            return response;
        }

 async static public Task<IBuffer> GetBufferAsync(string url)
        {

            httpClient = new HttpClient();
           
            var ResultStr = await httpClient.GetBufferAsync(new Uri(url));
            return ResultStr;
        }

這兩個靜態方法分別獲取url地址的buffer數據和輸入流。有了buffer或者stream之後就可以進行下一步-保存。

  當我們下載完成後,首先要做的很有可能是先顯示出來,然後再保存,所以先把數據寫入到圖片對象中:

這裡有兩種方法:

1.WriteableBitmap

 protected async Task<WriteableBitmap> GetWriteableBitmapAsync(string url)
        {
            try
            {
                IBuffer buffer = await GetBufferAsync(url);
                if (buffer != null)
                {
                    BitmapImage bi = new BitmapImage();
                    WriteableBitmap wb = null; Stream stream2Write;
                    using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
                    {

                        stream2Write = stream.AsStreamForWrite();

                        await stream2Write.WriteAsync(buffer.ToArray(), 0, (int)buffer.Length);

                        await stream2Write.FlushAsync();
                        stream.Seek(0);

                        await bi.SetSourceAsync(stream);

                        wb = new WriteableBitmap(bi.PixelWidth, bi.PixelHeight);
                        stream.Seek(0);
                        await wb.SetSourceAsync(stream);

                        return wb;
                    }
                }
                else
                {
                    return null;
                }
            }
            catch
            {
                return null;
            }
        }

2.SoftwareBitmap

public async Task<SoftwareBitmap> GetSoftwareBitmapAsync(string url)
        {
            try
            {
                IInputStream inputStream = await GetSteramAsync(url);
                IRandomAccessStream memStream = new InMemoryRandomAccessStream();
                await RandomAccessStream.CopyAsync(inputStream, memStream);
                BitmapDecoder decoder = await BitmapDecoder.CreateAsync(memStream);
                SoftwareBitmap sb = await decoder.GetSoftwareBitmapAsync(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
                return sb;
            }
            catch 
            {
                return null;
            }
        }

這兩種都可以作為展示圖像的數據源,其中WriteableBitmap可以直接給Image.Source , SoftwareBitmap這需要轉為SoftwareBitmap:

          SoftwareBitmapSource sbs = new SoftwareBitmapSource();
                sbs.SetBitmapAsync(sb);

接下來就是保存了:WriteableBitmap:

 public async Task SaveImageAsync(WriteableBitmap image, string filename)
        {
            try
            {
                if (image == null)
                {
                    return;
                }
                Guid BitmapEncoderGuid = BitmapEncoder.JpegEncoderId;
                if (filename.EndsWith("jpg"))
                    BitmapEncoderGuid = BitmapEncoder.JpegEncoderId;
                else if (filename.EndsWith("png"))
                    BitmapEncoderGuid = BitmapEncoder.PngEncoderId;
                else if (filename.EndsWith("bmp"))
                    BitmapEncoderGuid = BitmapEncoder.BmpEncoderId;
                else if (filename.EndsWith("tiff"))
                    BitmapEncoderGuid = BitmapEncoder.TiffEncoderId;
                else if (filename.EndsWith("gif"))
                    BitmapEncoderGuid = BitmapEncoder.GifEncoderId;
                var folder = await _local_folder.CreateFolderAsync("images_cache", CreationCollisionOption.OpenIfExists);
                var file = await folder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);

                using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
                {
                    BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoderGuid, stream);
                    Stream pixelStream = image.PixelBuffer.AsStream();
                    byte[] pixels = new byte[pixelStream.Length];
                    await pixelStream.ReadAsync(pixels, 0, pixels.Length);
                    encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore,
                              (uint)image.PixelWidth,
                              (uint)image.PixelHeight,
                              96.0,
                              96.0,
                              pixels);
                    await encoder.FlushAsync();
                }
            }
            catch
            {

            }
        }
public async Task WriteToFileAsync(StorageFolder folder,SoftwareBitmap sb,string fileName)
        {
           
            if (sb != null)
            {
                // save image file to cache
                StorageFile file = await folder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);
                using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.ReadWrite))
                {
                    BitmapEncoder encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream);
                    encoder.SetSoftwareBitmap(sb);
                    await encoder.FlushAsync();
                }
            }
        }

怎麼樣,是不是很簡單?


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一步:到官網下載第三方包,拷貝到自己的項目中 https://github.com/Maxwin-z/XListView-Android 第二步:xml文件 第三步:java代碼 ...
  • 嗨!各位,小編又和大家分享知識啦,在昨天的博客筆記中小編給大家講解瞭如何去配置Android工具以及SDK中的一些配置,那在今天的學習小編會帶給大家哪些Android知識呢?首先我們看一下今天的學習目錄吧。 知識一:瞭解Android項目目錄結構 知識二:Android的配置文件(清單文件) 知識三 ...
  • 這篇博客是關於如何搭建eclipse的android開發環境, 與網上的其他博客不同,我的方法比他們簡單的多,所 以推薦給大家。 搭建eclipse的android開發環境步驟: 1.配置JDK(Java Development Kit,Java開發工具包) (因為android是基於Java語言開 ...
  • 在Android王國中,Service是一個勞動模範,總是默默的在後臺運行,無怨無悔,且總是乾最臟最累的活,比如下載文件,傾聽音樂,網路操作等這些耗時的操作,所以我們請尊重的叫他一聲:"勞模,您辛苦了". 帶著這份好尊重,我又重新研讀了API的文檔,發現老外寫東西還是很靠譜的,人家在文檔中告訴你Se ...
  • 從iOS 8起,就有了App Extension。Extension的種類至今也擴充到了19種,應用也很廣泛,值得重點關註起來。 Extension幾乎可以看做一個內嵌的獨立App,擁有獨立的BundleID、證書、概要配置文件、進程空間、沙盒等等。只是需要打包在App內,類似於寄生在宿主App內, ...
  • 前言: 項目中必定用到的數據填寫需求。比如修改用戶名的文字編輯對話框,修改生日的日期選擇對話框等等。現總結一下,方便以後使用。 註: 先寫實現過程,想要學習的同學可以看看,不需要的同學可以直接拉到最下麵複製代碼使用。 一、文字編輯對話框 看下效果圖(仿今日頭條): 包括: 一個標題TextView ...
  • ParagraphString - 段落樣式的簡易處理 效果 源碼 https://github.com/YouXianMing/UI-Component-Collection 中的 ParagraphString ...
  • 作為一個MacBook的使用者,無不感受到蘋果對於系統和硬體的完美匹配. 蘋果電腦不適合玩游戲,所以我只用它開發iOS使用.電腦里除了Xcode和常用辦公軟體與通訊軟體以外,我沒有裝其他的任何大應用.更沒有存儲各種片... 但是使用一年以後,更新軟體的時候提示我存儲空間不足... 於是操作 左上角蘋 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...