2010-10-12 3 views
1

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

Этот вызов ...

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 я не думаю, что это проблема. Когда я смотрю на файлы изображений, используя шестнадцатеричный редактор, не представляется, что encoding неверен. На всякий случай я также пробовал разные размеры файлов.

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

Спасибо.

ответ

3
len = (int)fs.Length - 1; 

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

+0

Это код VB, которым я пользовался через конвертер. :(Глупо. Спасибо. –

2

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

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