Loading a picture file Image.FromFile VS FileStream

I must admit that I never understood what are the streams are all about- I always thought it's an internet thing. But now I run into a code that used a stream to load a file localy and I wonder if there is advantage for using a stream over... well the way I always loaded files:

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);
}
6
задан Asaf 20 August 2010 в 09:03
поделиться

4 ответа

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

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

15
ответ дан 8 December 2019 в 05:52
поделиться

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

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

3
ответ дан 8 December 2019 в 05:52
поделиться

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

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

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

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

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

2
ответ дан 8 December 2019 в 05:52
поделиться

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

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

2
ответ дан 8 December 2019 в 05:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: