Из памяти Image.FromFile
Почему я получаю ошибку из памяти? Спасибо вам
if (File.Exists(photoURI))
{
FileStream fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);
Image img = Image.FromStream(fs);
fs.Close();
}
Ответы
Ответ 1
В Image.FromFile
документация OutOfMemoryException
может быть выбрана, если:
В файле нет допустимого формата изображения.
-или -
GDI + не поддерживает формат пикселя файла.
Проверьте формат изображения.
Кроме того, если вы хотите закрыть поток сразу после загрузки изображения, вы должны сделать копию изображения. Посмотрите здесь. GDI + должен поддерживать поток открытым в течение всего срока службы изображения.
Ответ 2
Первая ошибка:
if (File.Exists())
Файловая система нестабильна, поэтому доступ к вашему файлу может меняться между строкой с условием if и следующей строкой. Не только это, но File.Exists() может возвращать true, но ваш FileStream все равно может выдать исключение, если вам не хватает разрешений безопасности для файла или если он уже заблокирован.
Вместо этого правильный способ справиться с этим - с помощью блока try/catch. Посвятите свое время разработки обработчику исключений, потому что вы все равно должны писать этот код.
Вторая ошибка:
fs.Close();
Эта строка должна быть внутри блока finally или у вас есть возможность оставить открытые дескрипторы файлов. Обычно я рекомендую блок using
для обеспечения надлежащего расположения такого рода ресурсов, но поскольку вам уже нужен try/catch, вы можете использовать такой код:
Image img = null;
FileStream fs = null;
try
{
fs = new FileStream(photoURI, FileMode.Open, FileAccess.Read);
img = Image.FromStream(fs);
}
finally
{
fs.Close();
}
Ответ 3
Вы не можете использовать Image.FromStream для своего файла, вместо этого вы должны декодировать файл, используя TiffBitmapDecoder
. Пример кода из MSDN:
// Open a Stream and decode a TIFF image
Stream imageStreamSource = new FileStream("tulipfarm.tif", FileMode.Open, FileAccess.Read, FileShare.Read);
TiffBitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapSource = decoder.Frames[0];
// Draw the Image
Image myImage = new Image();
myImage.Source = bitmapSource;
myImage.Stretch = Stretch.None;
myImage.Margin = new Thickness(20);
Ответ 4
У меня была такая же проблема, исключение из памяти для изображения или растрового изображения, и я попробовал изменить размер, покрасил его на панели и ящики с картинками. У меня была доступная память, поэтому в моем случае исключение было немного красной селедки.
После нескольких часов работы с ПК я обнаружил, что это была сторонняя DLL, которая не закрывала поток. Некоторая отладка "writeline", которая может быть полезна, чтобы проверить, действительно ли у вас есть доступная память:
proc = Process.GetCurrentProcess();
Console.WriteLine("Memory Usage" + proc.PrivateMemorySize64);
Ответ 5
См. этот ответ от Hans Passant:
GDI + был написан довольно давно, прежде чем .NET когда-либо появлялся. SDK оболочка для него была написана на С++. Чтобы он был совместим, он не мог используйте исключения. Сообщались об ошибках с кодами ошибок. Что никогда не масштабируется, GDI + имеет только 20 кодов ошибок. Это мало для такой большой фрагмент кода.
Код ошибки Status:: OutOfMemory перегружен, чтобы вещи. Иногда это действительно означает память, она не может выделять достаточно места для хранения битмартных бит. К сожалению, не знаю, как это произошла ошибка формата файла изображения с той же ошибкой код. Нет специального кода ошибки, который мог бы более точно Опишите это, я думаю.
Ответ 6
Снимите флажок Encrypt contents to secure data
в свойствах файла - это решило проблему для меня.
![enter image description here]()
Ответ 7
Убедитесь, что все файлы были закрыты, прежде чем открывать их снова. Это может быть один из открытых файлов.