前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)

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

作者头像
walterlv
发布2020-02-21 18:02:46
2.2K0
发布2020-02-21 18:02:46
举报

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

发布于 2020-02-17 08:32 更新于 2020-02-17 00:47

获取图片宽高的方法有很多种,本文介绍 .NET 中获取图片宽高的几种方法并评估其性能。如果你打算对大量图片进行一些处理,本文可能有用。


本文即将评估的方法

本文即将采用以下四种方法获取图片:

  1. System.Drawing.Imaging.Metafile
  2. System.Drawing.Bitmap
  3. System.Windows.Media.Imaging.BitmapImage
  4. System.Windows.Media.Imaging.BitmapDecoder

System.Drawing.Imaging.Metafile

实际上不要被这个名字误解了,Metafile 并不是“某个图片的元数据”,与之对应的 MetafileHeader 也不是“某个图片的元数据头”。Metafile 是微软 Windows 系统一种图片格式,也就是大家熟悉的 wmf 和 emf,分别是 Windows Metafile 和 Enhanced Metafile。

所以指望直接读取图片元数据头来提升性能的的小伙伴们注意啦,这不是你们要找的方法。

不过为什么这个也能拿出来说,是因为此类也可以读取其他格式的图片。

代码语言:javascript
复制
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+ 的静态图片性能不错,但比起现代的其他框架来说确实差得多。

代码语言:javascript
复制
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 框架显示。

代码语言:javascript
复制
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,此方法的性能会好得多。

代码语言:javascript
复制
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 次:

运行 1 次的时间消耗
运行 1 次的时间消耗

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

运行 10 次的时间消耗
运行 10 次的时间消耗

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

运行 100 次的时间消耗
运行 100 次的时间消耗

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

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

运行 10 次的时间消耗
运行 10 次的时间消耗

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

运行 100 次的时间消耗
运行 100 次的时间消耗

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

消耗时间(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 框架中原生自带的获取图片尺寸的方法来说:

  1. System.Windows.Media.Imaging.BitmapDecoder 的整体性能是最好的
  2. 对于同一张图,System.Windows.Media.Imaging.BitmapImage 的运行时间不随次数的增加而增加,其内部有缓存
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
    • 本文即将评估的方法
      • System.Drawing.Imaging.Metafile
      • System.Drawing.Bitmap
      • System.Windows.Media.Imaging.BitmapImage
      • System.Windows.Media.Imaging.BitmapDecoder
    • 性能对比
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档