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);
}
Если вы знаете , что ваш код будет загружать данные из файла, используйте Image.FromFile
- это, очевидно, более простой код, и он просто возможно, что в рамках фреймворка есть оптимизации, когда он работает с файлами.
Использование потока более гибкое, но если вам не нужна такая гибкость, используйте файловое решение.
Если вы хотите работать с файлами изображений, конечно, второе решение лучше. В вашем первом разделе у вас есть Bitmap bitmap = new Bitmap (fileStream);
вы знаете, что файл изображения не всегда является Bitmap, он также может быть 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. Загрузка изображения из потока обычно требует вдвое объема памяти, что всегда является проблемой для больших изображений.