【WPF/C#】联网异步获取二进制文件(如图片)的流程

简介: 原文:【WPF/C#】联网异步获取二进制文件(如图片)的流程 步骤: 联网异步获取Json数据。 使用Json.NET工具,反序列化Json为对应的实体类,获得该实体类的对象。 从对象身上获取图片路径(实体类中定义了头像图片是string类型的文件路径)。
原文: 【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

 

目录
相关文章
|
2月前
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
本文介绍了在C# WPF应用程序中引入外部iconfont图标时可能遇到的显示问题及其解决方法:1) 检查资源路径和引入格式是否正确,确保字体文件引用格式为“#xxxx”,并正确指向字体文件位置;2) 确保图标资源被包含在程序集中,通过设置字体文件的生成操作为Resource(资源)来实现。
C# WPF 中 外部图标引入iconfont,无法正常显示问题 【小白记录】
|
2月前
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
|
3月前
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
68 1
|
3月前
|
持续交付 jenkins C#
“WPF与DevOps深度融合:从Jenkins配置到自动化部署全流程解析,助你实现持续集成与持续交付的无缝衔接”
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)项目中应用DevOps实践,实现自动化部署与持续集成。通过具体代码示例和步骤指导,介绍选择Jenkins作为CI/CD工具,结合Git进行源码管理,配置构建任务、触发器、环境、构建步骤、测试及部署等环节,显著提升开发效率和代码质量。
69 0
|
3月前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
234 0
|
3月前
|
C#
C# async await 异步执行方法
C# async await 异步执行方法
49 0
|
3月前
|
C#
C# WPF 将第三方DLL嵌入 exe
C# WPF 将第三方DLL嵌入 exe
66 0
|
3月前
|
前端开发 C# 容器
WPF/C#:实现导航功能
WPF/C#:实现导航功能
60 0
|
3月前
|
设计模式 测试技术 C#
WPF/C#:在WPF中如何实现依赖注入
WPF/C#:在WPF中如何实现依赖注入
58 0