Исключение из нехватки памяти, если файлы большого размера - PullRequest
1 голос
/ 21 февраля 2012

В настоящее время я работаю над проверкой данных для изображений. Мне нужно запросить размер (ширина и высота) и разрешение изображения. Файлы размером более 70 МБ выдают исключение «недостаточно памяти» при проблеме GDI. Есть ли альтернативный способ получить файл-информацию? Та же ошибка при разборе его через FromStream ...

Using myfile = Image.FromFile(filePath)
...
End Using

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Вы можете использовать следующий код для получения свойств изображения (загружаются только метаданные):

using (var fs = new FileStream(@"C:\Users\Dmitry\Pictures\blue-earth-wallpaper.jpg", FileMode.Open, FileAccess.Read)) {
   var decoder = BitmapDecoder.Create(fs, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
   var size = decoder.Frames[0].PixelWidth;
   var height = decoder.Frames[0].PixelHeight;
   var dpiX = decoder.Frames[0].DpiX;
   var dpiY = decoder.Frames[0].DpiY;
}
0 голосов
/ 21 февраля 2012

Я нашел эту ссылку http://www.fastgraph.com/help/image_file_header_formats.html, которая сообщает, где в файле вы можете найти тип и его размеры. Я полагаю, если вы используете что-то подобное ниже для поиска и получения первых нескольких байтов и закрытия после завершения, не стоит использовать много ресурсов

Непроверенный код ниже ...

//  This really needs to be a member-level variable;
private static readonly object fsLock = new object();
//  Instantiate this in a static constructor or initialize() method
private static FileStream fs = new FileStream("myFile.txt", FileMode.Open);


public string ReadFile(int fileOffset) {

    byte[] buffer = new byte[bufferSize];

    int arrayOffset = 0;

    lock (fsLock) {
        fs.Seek(fileOffset, SeekOrigin.Begin);

        int numBytesRead = fs.Read(bytes, arrayOffset , bufferSize);

        //  Typically used if you're in a loop, reading blocks at a time
        arrayOffset += numBytesRead;
    }

    // Do what you want to the byte array and close

}
...