天天看點

【WPF/C#】聯網異步擷取二進制檔案(如圖檔)的流程

原文: 【WPF/C#】聯網異步擷取二進制檔案(如圖檔)的流程 步驟:

  1. 聯網異步擷取Json資料。
  2. 使用 Json.NET 工具,反序列化Json為對應的實體類,獲得該實體類的對象。
  3. 從對象身上擷取圖檔路徑(實體類中定義了頭像圖檔是string類型的檔案路徑)。
  4. 根據圖檔路徑,再次聯網異步擷取圖檔。
  5. 将二進制資源轉換為合适的類型(可能需要多步轉換)。
  6. 給控件使用。
public partial class MyWindow : Window
{
    public MyWindow()
    {
        InitializeComponent();
        // 初始化設計師的個人資訊
        InitDesignerInfo();
    }

    private async void InitDesignerInfo()
    {
        // 1、聯網異步擷取Json資料
        string uri = "資源在伺服器的路徑";
        string json = await SystemUtils.GetJsonDataFromWebServerAsync(uri);   // 使用Json.NET三方庫

        // 2、反序列化Json為對應的實體類
        DesignerInfo info = JsonConvert.DeserializeObject<DesignerInfo>(json); // DesignerInfo實體類

        // 3、從對象身上擷取圖檔路徑
        string avatarPath = info.Avatar;

        // 4、再聯網異步擷取頭像圖檔
        Task<System.Drawing.Image> result = SystemUtils.GetBitmapFromWebServerAsync(avatarPath);
        System.Drawing.Image image = await result;

        // 5、轉型:Image --> Bitmap --> BitmapImage
        Bitmap bitmap = new Bitmap(image);
        BitmapImage bitmapImage = SystemUtils.BitmapToBitmapImage(bitmap);

        // 給控件使用資源
        avatar.Source = bitmapImage;
    }
}           

把一些通用的操作單獨抽取作為一個工具類

public class SystemUtils{
    /// <summary>
    /// 異步方法:聯網從服務端擷取Json資料
    /// </summary>
    /// <param name="uri">資源的絕對路徑(伺服器IP + 資源的相對路徑)</param>
    /// <returns>資源的内容</returns>
    public static async Task<string> GetJsonDataFromWebServerAsync(string uri)
    {
        // 參考:https://msdn.microsoft.com/en-us/library/hh191443(v=vs.110).aspx
        WebClient client = new WebClient();
        string result = await client.DownloadStringTaskAsync(new Uri(uri));
        return result;
    }

    /// <summary>
    /// 異步方法:聯網擷取Bitmap二進制資料
    /// </summary>
    /// <param name="uri">資源的絕對路徑(伺服器IP + 資源的相對路徑)</param>
    /// <returns>Bitmap圖檔</returns>
    public static async Task<Image> GetBitmapFromWebServerAsync(string uri)
    {
        // 參考:https://msdn.microsoft.com/en-us/library/hh191443(v=vs.110).aspx
        WebClient client = new WebClient();
        byte[] result = await client.DownloadDataTaskAsync(new Uri(uri));

        Image image = SystemUtils.ByteArrayToImage(result);

        return image;
    }

    /// <summary>  
    /// byte[] --> Image  
    /// </summary>  
    /// <param name="byteArrayIn">二進制圖檔流</param>  
    /// <returns>System.Drawing.Image</returns>  
    public static System.Drawing.Image ByteArrayToImage(byte[] byteArrayIn)
    {
        if (byteArrayIn == null)
            return null;
        using (MemoryStream ms = new MemoryStream(byteArrayIn))
        {
            System.Drawing.Image image = System.Drawing.Image.FromStream(ms);
            ms.Flush();
            return image;
        }
    }

    /// <summary>
    /// Bitmap --> BitmapImage
    /// </summary>
    /// <param name="bitmap"></param>
    /// <returns>BitmapImage</returns>
    public static BitmapImage BitmapToBitmapImage(Bitmap bitmap)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            bitmap.Save(stream, ImageFormat.Bmp);

            stream.Position = 0;
            BitmapImage result = new BitmapImage();
            result.BeginInit();
            // According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed."
            // Force the bitmap to load right now so we can dispose the stream.
            result.CacheOption = BitmapCacheOption.OnLoad;
            result.StreamSource = stream;
            result.EndInit();
            result.Freeze();

            return result;
        }
    }

}           

關于Bitmap和BitmapImage等圖檔相關類的轉換方法:

http://blog.csdn.net/wangshubo1989/article/details/47296339 http://blog.csdn.net/qq_18995513/article/details/53693554

更多相關内容:

谷歌搜關鍵字 C# WPF Convert Bitmap BitmapImage