2009-05-31 14 views
1

Ich habe eine Funktion, die eine Datei in ein Byte-Array (Daten) extrahiert.C# Bitmap-Bilder, Byte-Arrays und Streams!

 int contentLength = postedFile.ContentLength; 
     byte[] data = new byte[contentLength]; 
     postedFile.InputStream.Read(data, 0, contentLength); 

Später verwende ich diesen Byte-Array ein System.Drawing.Image Objekt zu konstruieren (wo Daten der Byte-Array)

 MemoryStream ms = new MemoryStream(data); 
     Image bitmap = Image.FromStream(ms); 

Ich erhalte die folgende Ausnahme „Argument: Parameter ist nicht gültig . "

Das Original geschrieben Datei enthielt ein 500k-JPEG-Bild ...

Irgendwelche Ideen, warum dies nicht funktioniert?

Hinweis: Ich versichere Ihnen, ich habe einen triftigen Grund für die Umwandlung in ein Byte-Array und dann in einen Speicher-Stream !!

+0

Enthält die Daten nur die Bilddaten? Sie sagen nicht, welcher Typ 'postedFile' ist. – ChrisF

+1

Woher bekommen Sie diesen Fehler? Der Code, den du gepostet hast, sollte gut funktionieren ... –

+0

postenDatei ist eine HttpPostedFileBase. Der Fehler tritt in der Zeile Bitmap = Image.FromStream (ms) auf; :( – iasksillyquestions

Antwort

5

Das ist höchstwahrscheinlich, weil Sie nicht alle Dateidaten in das Byte-Array erhalten haben. Die Read-Methode muss nicht so viele Bytes zurückgeben, wie Sie anfordern, und sie gibt die Anzahl der Bytes zurück, die tatsächlich in das Array eingegeben wurden. Sie müssen Schleife, bis Sie alle Daten erhalten haben:

int contentLength = postedFile.ContentLength; 
byte[] data = new byte[contentLength]; 
for (int pos = 0; pos < contentLength;) { 
    pos += postedFile.InputStream.Read(data, pos, contentLength - pos); 
} 

Dies ist ein häufiger Fehler beim Lesen aus einem Stream. Ich habe dieses Problem oft gesehen.

Edit:
Mit der Prüfung auf ein baldiges Ende des Stromes, wie Matthew vorgeschlagen, würde der Code sein:

int contentLength = postedFile.ContentLength; 
byte[] data = new byte[contentLength]; 
for (int pos = 0; pos < contentLength;) { 
    int len = postedFile.InputStream.Read(data, pos, contentLength - pos); 
    if (len == 0) { 
     throw new ApplicationException("Upload aborted."); 
    } 
    pos += len; 
} 
+0

Verwendet der vorgeschlagene Code: int ContentLength = postedFile.ContentLength; byte [] data = new byte [ContentLength]; für (int pos = 0; pos iasksillyquestions

+0

Sie sollten auch nach einer Rückkehr von 0 suchen, nur für den Fall, dass Sie das Ende des Streams früh treffen. –

+0

Ist 0 ein gültiger Wert? – iasksillyquestions

1

Sie überprüfen nicht den Rückgabewert von postedFile.InputStream. Read. Es ist nicht überhaupt garantiert, um das Array beim ersten Anruf zu füllen. Das führt zu einem beschädigten JPEG in Daten (0 statt Dateiinhalt).

0

Ich hatte Probleme beim Laden von Bildern in .NET, die durch robustere Bildbibliotheken geöffnet werden konnten. Es ist möglich, dass das spezifische JPEG-Bild, das Sie haben, von .NET nicht unterstützt wird. JPEG-Dateien sind nicht nur eine Art der Kodierung, es gibt eine Vielzahl möglicher Komprimierungsschemata.

Sie könnten es mit einem anderen Bild versuchen, von dem Sie wissen, dass es in einem unterstützten Format ist.

1

Haben Sie den Rückgabewert des Read() -Aufrufs überprüft, um sicherzustellen, dass tatsächlich der gesamte Inhalt gelesen wird? Vielleicht gibt Read() nur einen Teil des Streams zurück, so dass Sie den Read() - Aufruf wiederholen müssen, bis alle Bytes verbraucht sind.

1

Gibt es Gründe, warum Sie dies nicht einfach tun:

Image bitmap = Image.FromStream(postedFile.InputStream); 
+0

> Hinweis: Ich versichere Ihnen, ich habe eine gültige > Grund für die Umwandlung in ein Byte-Array > und dann auf einen Speicher-Stream! – snarf

Verwandte Themen