我必须承认,我从不理解流是什么 - 我一直认为这是互联网的事情。但是现在我遇到了一个使用流来加载文件的代码,我想知道是否有使用流的优势......以及我总是加载文件的方式:
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);
}
答案 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格式的图像时,您将免费获得它。从流中加载图像往往需要两次内存量,这对于大图像来说总是一个问题。