【问题标题】:difference between image bitmap and fromFile methods in c#c#中图像位图和fromFile方法的区别
【发布时间】:2016-05-18 17:55:37
【问题描述】:

我发现有两种方法可以使用默认的 c# 库来读取图像信息。其中之一是

 System.Drawing.Image image = new Bitmap("file..path");

另一个是:

Image image = Image.FromFile("file..path");

如果我需要读取大量图像(近 100TB 数据),谁能告诉我哪个运行得更快。

【问题讨论】:

  • 好问题,但您可以自己回答。双向计时,并使用更快的方法。如果有的话。
  • 如果您要处理 100TB 的照片,请使用 c++,因为它更高效。此外,您很可能没有 100TB 的内存,所以祝您同时将所有这些图像加载到内存中。
  • @JasonHeddle,OP 的问题中没有任何内容表明他计划将所有图像同时保存在内存中。
  • Bitmap 构造函数总是创建一个 Bitmap 对象,Image.FromFile() 也可以,但也可以返回一个 Metafile。这些都与速度无关。
  • @adv12 我想我不知道哪一个会运行得更快,除非我用 100TB 数据同时尝试它们,因为我认为一种方法可能会在少量的情况下比另一种运行得更快数据,但对于大量数据,运行速度要慢得多。

标签: c# image image-processing bitmap system.drawing


【解决方案1】:

我发现有两种方法可以读取图片信息

你知道,如果它只是你所追求的图像信息,那么我不会使用任何一个函数,因为它们都将 整个图像从磁盘加载到内存中 - 这是对计算机资源的相当浪费的练习.

相反,您应该只加载图像文件头,无论它是 EXIF; BITMAPINFOHEADER 或其他取决于图像格式。有一些方法可以通过 .NET 加载此类信息(请参阅下面的链接)。

图片标题

除了 RAW 图像文件格式(不一定是从 SLR 相机输出的格式)之外,大多数图像文件格式都有一个可以在将图像光栅数据从磁盘加载到内存之前加载的标题。实际上,通常要求首先读取标头,否则您将不知道在加载图像之前要分配多少内存。

  • 它有多宽?
  • 多高?
  • 每个像素有多少位(颜色深度)?

...等等。这些都是通过首先读取图像文件头来回答的。顾名思义,有关图像的信息通常位于文件开头附近。确切的格式和布局取决于相关的文件格式。见 BMP; PNG 资源以获取更多信息。

这里有一些关于加载图片标题的建议

【讨论】:

  • 感谢您的评论。我需要读取图像信息并获取两个图像属性,图像描述和图像日期。我还可以使用您建议的解决方案吗?
  • 是的。这些策略对您有用,尤其是 EXIF,无需您将整个图像文件加载到内存中。 System.Drawing.Bitmap 很可能取决于文件中存在的 EXIF 信息,GetPropertyItem() 才能工作
  • 谢谢。你到底是什么意思“加载图像标题”,标题是指图像信息??
  • 似乎读取图像标题只能让我获得图像尺寸。你知道我如何通过读取标题来获取图像属性和图像日期吗?
  • @user3369592 图像属性只是对从 EXIF 获得的图像元数据的封装。按照提到 EXIF 的链接进行操作
猜你喜欢
  • 2017-05-16
  • 2011-11-16
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多