6

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

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);
}
4

4 回答 4

16

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

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

于 2010-08-20T09:06:35.997 回答
3

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

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

于 2010-08-20T09:10:43.717 回答
3

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

非常高效,当您对 .bmp 格式的图像使用 FromFile() 或 Bitmap(string) 构造函数时,您将免费获得它。从流中加载图像往往需要两倍的内存量,这对于大图像来说总是一个问题。

于 2010-08-20T11:06:59.323 回答
2

作为乔恩答案的补充:

据我所知,这两种方法也不做同样的事情。第一个给你第一张图片,"C:\"第二张给你一张来自路径的图片。所以第一个增加的复杂性不仅仅是因为它使用了流。

这将是等效的:

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

Image.FromFile在这种情况下,按照乔恩的解释,这样做肯定会更好。

于 2010-08-20T09:09:17.287 回答