加载图片文件Image.FromFile VS FileStream

我必须承认,我从来都不明白流是什么 – 我一直以为这是互联网的事情。 但是现在我遇到了一个使用流来加载文件的代码,我想知道是否有使用流的优势……以及我总是加载文件的方式:

private void loadingfromStream() { DirectoryInfo dirInfo = new DirectoryInfo("c:/"); FileInfo[] fileInfoArr = dirInfo.GetFiles(); FileInfo fileInfo = fileInfoArr[0]; // creating a bitmap from a stream FileStream fileStream = fileInfo.OpenRead(); Bitmap bitmap = new Bitmap(fileStream); Image currentPicture = (Image)bitmap } 

 private void loadingUsingImageClass { Image currentPicture = Image.FromFile(originalPath); } 

如果您知道您的代码将从文件加载数据,请使用Image.FromFile – 这显然是相当简单的代码,并且在处理文件时框架内部可能存在优化。

使用流更灵活,但除非您需要这种灵活性,否则请使用文件解决方案。

如果你想处理图像文件,当然第二种解决方案更好。 在第一部分中,您有Bitmap bitmap = new Bitmap(fileStream); 你知道图像文件并不总是Bitmap,它也可以是JPEG / PNG / TIFF等。 虽然Image.FromFile非常专业,可以处理具有不同扩展名的图像文件。

一般来说, FileStream在文件问题上很常见,而Image.FromFile在图像文件中更为常见。 这取决于您要处理的文件类型。

作为Jon回答的补充:

据我所知,这两种方法也没有做同样的事情。 第一个是给你第一个图像在"C:\"中,第二个图像只是给你一个路径的图像。 因此,第一个增加的复杂性不仅仅是因为它使用流。

这相当于:

 using (var fs = File.OpenRead(path)) using (var img = Image.FromStream(fs)) { //... } 

在这种情况下,当Jon解释时,用Image.FromFile做这件事肯定会更好。

好吧,文件通常也被视为流。 这就是打开文件的主类称为FileStream的原因。 但是有一个特定的操作系统function可以使处理图像文件更加高效。 它被称为“内存映射文件”,这是一种将文件内容直接映射到内存的function。 有一些烟雾和镜子,但它实际上使文件直接可用,而无需阅读。 存储文件数据所需的内存不占用页面文件中的空间。

非常高效,当您使用FromFile()或Bitmap(字符串)构造函数为.bmp格式的图像时,您将免费获得它。 从流加载图像往往需要两倍的内存量,总是大图像的问题。