.NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)

栏目: IT技术 · 发布时间: 4年前

内容简介:获取图片宽高的方法有很多种,本文介绍 .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;

性能对比

为了测试性能,我使用下面这张非常大的图,同一张图运行多次:

.NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)

分别运行以上四个方法各 1 次:

.NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)

分别运行以上四个方法各 10 次:

.NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)

分别运行以上四个方法各 100 次(可以发现大量的 GC):

.NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)

现在,使用不同的图片运行多次。

分别运行以上四个方法各 10 张图片:

.NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)

分别运行以上四个方法各 100 张图片(可以发现大量的 GC):

.NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)

做成图表,对于同一张图片运行不同次数:

消耗时间(ms) Metafile Bitmap BitmapImage BitmapDecoder
1次 175 107 71 2
10次 1041 1046 63 17
100次 10335 10360 56 122

.NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)

对于不同图片运行不同次数:

消耗时间(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 程序如何获取图片的宽高(框架自带多种方法的不同性能)

可以发现,对于 .NET 框架中原生自带的获取图片尺寸的方法来说:

System.Windows.Media.Imaging.BitmapDecoder
System.Windows.Media.Imaging.BitmapImage

参考资料


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Design Handbook

Web Design Handbook

Baeck, Philippe de 编 / 2009-12 / $ 22.54

This non-technical book brings together contemporary web design's latest and most original creative examples in the areas of services, media, blogs, contacts, links and jobs. It also traces the latest......一起来看看 《Web Design Handbook》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具