内容简介:获取图片宽高的方法有很多种,本文介绍 .NET 中获取图片宽高的几种方法并评估其性能。如果你打算对大量图片进行一些处理,本文可能有用。本文即将采用以下四种方法获取图片:
获取图片宽高的方法有很多种,本文介绍 .NET 中获取图片宽高的几种方法并评估其性能。如果你打算对大量图片进行一些处理,本文可能有用。
本文即将评估的方法
本文即将采用以下四种方法获取图片:
System.Drawing.Imaging.Metafile System.Drawing.Bitmap System.Windows.Media.Imaging.BitmapImage System.Windows.Media.Imaging.BitmapDecoder
System.Drawing.Imaging.Metafile
实际上不要被这个名字误解了, Metafile
并不是“某个图片的元数据”,与之对应的 MetafileHeader
也不是“某个图片的元数据头”。Metafile 是微软 Windows 系统一种图片格式,也就是大家熟悉的 wmf 和 emf,分别是 Windows Metafile 和 Enhanced Metafile。
所以指望直接读取图片元数据头来提升性能的的小伙伴们注意啦,这不是你们要找的方法。
不过为什么这个也能拿出来说,是因为此类也可以读取其他格式的图片。
var header = Metafile.FromFile(@"D:\blog.walterlv.com\large-background-image.jpg"); var witdh = header.Width; var height = header.Height;
能拿到。
System.Drawing.Bitmap
这个实际上是封装的 GDI+ 位图,所以其性能最好也是 GDI+ 的性能,然而都知道 GDI+ 的静态图片性能不错,但比起现代的其他框架来说确实差得多。
var bitmap = new Bitmap(@"D:\blog.walterlv.com\large-background-image.jpg"); var witdh = bitmap.Width; var height = bitmap.Height;
System.Windows.Media.Imaging.BitmapImage
这是 WPF 框架中提供的显示位图的方法,生成的图片可以直接被 WPF 框架显示。
var bitmap = new BitmapImage(new Uri(@"D:\blog.walterlv.com\large-background-image.jpg", UriKind.Absolute)); var witdh = bitmap.Width; var height = bitmap.Height;
System.Windows.Media.Imaging.BitmapDecoder
这也是 WPF 框架中提供的方法,但相比完全加载图片到可以显示的 System.Windows.Media.Imaging.BitmapImage
,此方法的性能会好得多。
var decoder = new JpegBitmapDecoder(new Uri(@"D:\blog.walterlv.com\large-background-image.jpg", UriKind.Absolute), BitmapCreateOptions.DelayCreation, BitmapCacheOption.OnDemand); var frame = decoder.Frames[0]; var witdh = frame.PixelWidth; var height = frame.PixelHeight;
性能对比
为了测试性能,我使用下面这张非常大的图,同一张图运行多次:
分别运行以上四个方法各 1 次:
分别运行以上四个方法各 10 次:
分别运行以上四个方法各 100 次(可以发现大量的 GC):
现在,使用不同的图片运行多次。
分别运行以上四个方法各 10 张图片:
分别运行以上四个方法各 100 张图片(可以发现大量的 GC):
做成图表,对于同一张图片运行不同次数:
消耗时间(ms) | Metafile | Bitmap | BitmapImage | BitmapDecoder |
---|---|---|---|---|
1次 | 175 | 107 | 71 | 2 |
10次 | 1041 | 1046 | 63 | 17 |
100次 | 10335 | 10360 | 56 | 122 |
对于不同图片运行不同次数:
消耗时间(ms) | Metafile | Bitmap | BitmapImage | BitmapDecoder |
---|---|---|---|---|
1次 | 175 | 107 | 71 | 2 |
10次 | 998 | 980 | 83 | 20 |
100次 | 10582 | 10617 | 255 | 204 |
1000次 | 127023 | 128627 | 3456 | 4015 |
可以发现,对于 .NET 框架中原生自带的获取图片尺寸的方法来说:
System.Windows.Media.Imaging.BitmapDecoder System.Windows.Media.Imaging.BitmapImage
参考资料
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- RPC框架是啥之Java自带RPC实现,RMI框架入门
- laravel自带用户认证
- Mac自带apache配置
- opencv自带例子学习-图像混合
- Golang中自带的强大命令工具
- Android调用系统自带的分享功能
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
TCP/IP网络管理
亨特 / 电子工业 / 2006年3月1日 / 79.00元
本书是一本架设与维护TCP/IP网络的完整指南,无论你是在职的系统管理员,还是需要访问Internet的家用系统用户,都可从本书获得帮助。本书还讨论了高级路由协议(RIPv2、OSPF、BGP),以及实现这些协议的gated软件。对于各种重要的网络服务,如DNS,Apache,sendmail,Samba,PPP和DHCP,本书都提供了配置范例,以及相关的软件包与工具的语法参考。一起来看看 《TCP/IP网络管理》 这本书的介绍吧!