Ошибка загрузки растрового изображения из MemoryStream

Я пытаюсь загрузить изображения (pdf-файлы и документы Word) из потока памяти, чтобы я мог манипулировать ими до того, как они будут добавлены в pdf-файл. Всякий раз, когда я пытаюсь загрузить растровое изображение или GIF, я получаю одну из ужасных ошибок GDI+.

Этот звонок...

System.Drawing.Bitmap myImage = System.Drawing.Image.FromStream(docStream);  

Выдает эту ошибку...

System.Runtime.InteropServices.ExternalException occurred
  Message="A generic error occurred in GDI+."
  Source="System.Drawing"
  ErrorCode=-2147467259
  StackTrace:
       at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
       at System.Drawing.Image.FromStream(Stream stream)  

и этот звонок...

System.Drawing.Bitmap myImage = new System.Drawing.Bitmap(docStream);

Выдает эту ошибку...

System.ArgumentException occurred
  Message="Parameter is not valid."
  Source="System.Drawing"
  StackTrace:
       at System.Drawing.Bitmap..ctor(Stream stream)

Код работает для png, jpg и tif, но не для bmp или GIF.

Это в основном:

MemoryStream docStream = GetMemoryStream(filePath);
// The next line errors...
System.Drawing.Bitmap myImage = new System.Drawing.Bitmap(docStream);

    private MemoryStream GetMemoryStream(string file)
    {
        FileStream fs = null;
        Byte[] bytes;
        int len;

        fs = File.OpenRead(file);
        len = (int)fs.Length - 1;
        bytes = new Byte[len];
        fs.Read(bytes, 0, len);

        return new MemoryStream(bytes);

    }

Я нигде не закрываю MemoryStream, и если на png и jpg не влияет closed MemoryStream Я не думаю, что проблема в этом. Когда я просматриваю файлы изображений с помощью шестнадцатеричного редактора, не видно, что кодировка неверна. Я также пробовал разные размеры файлов, на всякий случай.

На данный момент я в значительной степени в растерянности. Любая помощь будет принята с благодарностью.

Спасибо.


person bill_the_loser    schedule 12.10.2010    source источник


Ответы (2)


    len = (int)fs.Length - 1;

Не знаете, почему вы подумали, что это была хорошая идея, когда вы программировали на VB? Отбросьте -1, вы хотите прочитать все байты, а не все байты за вычетом последнего. File.ReadAllBytes() будет хорошим выбором.

person Hans Passant    schedule 12.10.2010
comment
Это был код VB, который я пропустил через конвертер. :( Глупо. Спасибо. - person bill_the_loser; 13.10.2010

Нет гарантии, что чтение заполнит буфер; просто он должен возвращать некоторые данные. Более распространенным подходом может быть:

byte[] buffer = new byte[2048];
int read;
while((read = source.Read(buffer, 0, buffer.Length)) > 0) {
    memStream.Write(buffer, 0, read);
}
memStream.Position = 0; //rewind to read it
person Marc Gravell    schedule 12.10.2010