WPF客户端读取高清图片很卡,缩略图解决方案

简介:

Ftp上传上,有人上传了高清图片,每张图片大约2M

如果使用传统的BitmapImage类,然后绑定 Source 属性的方法,有些电脑在首次会比较卡,一张电脑10秒,4张大约会卡40秒。

 

所以我先异步的下载图片,得到downloadFileStream对象,然后绑定到BitmapImage类上。例如:

System.Windows.Controls.Image photo = new Image

{

    Width = 100,

    Height = 100,

    Margin = new Thickness(2),

    Stretch = Stretch.Uniform

};

 

BitmapImage bitmap = new BitmapImage();

bitmap.BeginInit();

bitmap.StreamSource = downloadFileStream;

bitmap.EndInit();

 

photo.Source = bitmap;

 

ListBoxItem lbi = new ListBoxItem()

{

    DataContext = pvo,

    Content = photo

};

 

this.lbPhotoes.Items.Add(lbi);

 

因为bitmapStreamSource比较大,造成lbi对象比较大,所以lbPhotoes.Items.Add 方法在添加了两张图片之后就会卡大约30秒的时间。

 

所以尝试使用缩略图的方式来使BitmapImage的对象变小,在这里采用缩略图是因为客户端需要图片大小大致是

(100,100)。

 

完整的代码如下:

System.Windows.Controls.Image photo = new Image

{

    Width = 100,

    Height = 100,

    Margin = new Thickness(2),

    Stretch = Stretch.Uniform

};

 

using (System.Drawing.Image drawingImage = System.Drawing.Image.FromStream(downloadFileStream))

{

using (System.Drawing.Image thumbImage =

drawingImage.GetThumbnailImage(100, 100, () => { return true; }, IntPtr.Zero))

    {

        MemoryStream ms = new MemoryStream();

        thumbImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

 

        BitmapFrame bf = BitmapFrame.Create(ms);

        photo.Source = bf;

    }

}

 

ListBoxItem lbi = new ListBoxItem()

{

    DataContext = pvo,

    Content = photo

};

 

this.lbPhotoes.Items.Add(lbi);

 

在这里,要引用System.Drawing.dll.使用System.Drawing.Image 类的GetThumbnailImage 方法来获取thumbImage,接着使用MemoryStream来保存缩略图的stream,接着用缩略图的stream来生成图片了。

 

 

最后说一句:虽然解决了这个问题,不过每次都要下载高清图片,生成缩略图,这是很耗时的,所以在上传图片的时候就应该生成缩略图了,将缩略图保存起来了。因为在局域网中,网速比较快,这种方式基本也可以满足要求了。






本文转自LoveJenny博客园博客,原文链接:http://www.cnblogs.com/LoveJenny/archive/2011/12/02/2271543.html,如需转载请自行联系原作者

目录
相关文章
|
4月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
123 0
|
4月前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
174 0
C#WPF 图片在显示时没有问题,但在运行时图片显示不出来的解决
选中项目,点击右上角的显示全部文件按钮,会将默认隐藏的文件显示出来,选中所需图片,右键,添加到项目,然后选择图片查看属性,生成操作选择resource。完毕。本人目前的解决方案。
459 41
C#WPF 图片在显示时没有问题,但在运行时图片显示不出来的解决
|
C# 开发者
一款WPF开发的网易云音乐客户端 - DMSkin-CloudMusic
一款WPF开发的网易云音乐客户端 - DMSkin-CloudMusic
211 36
|
C#
WPF Image Source 设置相对路径图片
原文:WPF Image Source 设置相对路径图片   BitmapImage bt = new BitmapImage(new Uri("Images\\3_u10484.png", UriKind.Relative));this.Img1.Source = bt;
4012 0
|
C#
WPF 图片灰度处理
原文:WPF 图片灰度处理 文章的内容是来自微软中文技术论坛的一个帖子,当时是想将一段将图片灰度处理的代码转换为XAML的一个样式,在这里要谢谢 Xiao Yan Qiang、Sheldon _Xiao、shixin的热情回答,现在将他们的回答贴出来供大家学习参考.
1137 0
|
C#
WPF 将图片进行灰度处理
原文:WPF 将图片进行灰度处理 处理前:      处理后:   这个功能使用使用了 FormatConvertedBitmap(为BitmapSource提供像素格式转换功能)   代码如下:   public partial class MainWindow : Window ...
1011 0
|
C# 容器 前端开发
WPF 把图片分割成两份自动翻页 WpfFlipPageControl:CtrlBook 书控件
原文:WPF 把图片分割成两份自动翻页 WpfFlipPageControl:CtrlBook 书控件 版权声明:本文为博主原创文章,需要转载尽管转载。 https://blog.
1325 0
|
算法 容器 数据可视化
WPF_界面_图片/界面/文字模糊解决之道整理
原文:WPF_界面_图片/界面/文字模糊解决之道整理 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010265681/article/details/76651792 图片模糊: 图片尺寸:  检查图片,png, DPI=72,Stretch="None",原图尺寸和xaml里面写的尺寸一致。
1313 0
|
JSON C# 数据格式
【WPF/C#】联网异步获取二进制文件(如图片)的流程
原文:【WPF/C#】联网异步获取二进制文件(如图片)的流程 步骤: 联网异步获取Json数据。 使用Json.NET工具,反序列化Json为对应的实体类,获得该实体类的对象。 从对象身上获取图片路径(实体类中定义了头像图片是string类型的文件路径)。
1322 0