原文: 【WPF/C#】聯網異步擷取二進制檔案(如圖檔)的流程 步驟:
- 聯網異步擷取Json資料。
- 使用 Json.NET 工具,反序列化Json為對應的實體類,獲得該實體類的對象。
- 從對象身上擷取圖檔路徑(實體類中定義了頭像圖檔是string類型的檔案路徑)。
- 根據圖檔路徑,再次聯網異步擷取圖檔。
- 将二進制資源轉換為合适的類型(可能需要多步轉換)。
- 給控件使用。
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