【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

 

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