Загрузка файла изображения Image.FromFile VS FileStream - PullRequest
6 голосов
/ 20 августа 2010

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

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 ]

15 голосов
/ 20 августа 2010

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

Использование потока более гибко, но если вам не требуется необходимость в такой гибкости, используйте файловое решение.

3 голосов
/ 20 августа 2010

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

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

2 голосов
/ 20 августа 2010

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

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

2 голосов
/ 20 августа 2010

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

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

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

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

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

...