加载图片文件Image.FromFile VS FileStream

时间:2010-08-20 09:03:28

标签: c# image filesystems loading fromfile

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

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       
}

VS

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

4 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

作为Jon回答的补充:

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

这相当于:

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

在那种情况下,如Jon所解释的那样,用Image.FromFile做这件事肯定会更好。

答案 3 :(得分:2)

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

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