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

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

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

参考资料


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

查看所有标签

猜你喜欢:

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

轻快的Java

轻快的Java

(美)塔特、杰兰德/国别:中国大陆 / 张晓坤 / 中国电力出版社 / 2006-7 / 29.00元

Java的开发者正深陷于复杂性的泥沼中而无法自拔。我们的经验和能力正接近极限,程序员为了编写支持所选框架的程序所花的时间比解决真正问题的时间要多得多。我们不禁要问,有必要把Java搞得这么复杂吗?   答案是否定的。本书给你指引了一条出路。无论是维护应用程序,还是从头开始设计,你都能够超越成规,并大幅精简基本框架、开发过程和最终代码。你能重新掌握一度失控的J2EE应用程序。   在本书......一起来看看 《轻快的Java》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

SHA 加密
SHA 加密

SHA 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具