Загрузка изображения файла изображения.FromFile против FileStream

Я должен признать, что я никогда не понимал, что такое потоки - я всегда думал, что это интернет-вещь. Но теперь я сталкиваюсь с кодом, который использовал поток для загрузки файла localy, и мне интересно, есть ли преимущество для использования потока... ну, как я всегда загружал файлы:

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 ответов


Если вы знаю ваш код будет загружать данные из файла, используйте Image.FromFile - Это, очевидно, довольно простой код, и вполне возможно, что есть оптимизация в рамках, когда он имеет дело с файлами.

использование потока более гибко, но если вы нужно эта гибкость, перейдите к файловому решению.


если вы хотите иметь дело с файлами изображений, конечно, второе решение лучше. В первом разделе, у вас есть Bitmap bitmap = new Bitmap(fileStream); вы знаете, что файл изображения не всегда растровый, он также может быть JPEG/PNG / TIFF и так далее. В то время как Image.FromFile является довольно профессиональным для работы с файлами изображений с различными расширениями.

вообще говоря, FileStream распространен при проблемах с файлами, в то время как Image.FromFile более конкретно в файлах изображений. Это зависит от того, какие файлы вы собираетесь иметь дело с.


как дополнение к Джонсу ответ:

насколько я вижу, эти два метода не одно и то же. Первый дает вам первое изображение в "C:\" где второй просто дает вам изображение из пути. Таким образом, добавленная сложность в первом не только потому, что она использует потоки.

Это было бы эквивалентно:

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

и в этом случае, конечно, лучше просто сделать это с Image.FromFile Как пояснил Джон.


Ну, файл часто рассматривается как поток, а также. Вот почему основной класс для открытия файлов называется FileStream. Но есть определенная функция операционной системы, которая может сделать работу с файлами изображений много более эффективным. Он называется памяти сопоставленных файлов, функция, которая отображает содержимое файла в память. Есть некоторые дым и зеркала, но это по существу делает файл непосредственно доступным без необходимости читать его. Память нужно хранение данных файла не занимает места в файле подкачки.

очень эффективно, вы получите его бесплатно, когда вы используете fromfile () или Bitmap (string) конструктор для изображения в .формат BMP. Загрузка изображения из потока, как правило, требуют два раза объем памяти, всегда проблема с большими изображениями.