C # растровые изображения, байтовые массивы и потоки! - PullRequest
1 голос
/ 31 мая 2009

У меня есть функция, которая извлекает файл в байтовый массив (данные).

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

Позже я использую этот байтовый массив для создания объекта System.Drawing.Image. (где данные - байтовый массив)

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

Я получаю следующее исключение «ArgumentException: параметр недопустим.»

Исходный файл содержит изображение в формате 500k jpeg ...

Есть идеи, почему это не работает?

Примечание. Уверяю вас, у меня есть веская причина для преобразования в массив байтов, а затем в поток памяти !!

Ответы [ 5 ]

5 голосов
/ 31 мая 2009

Скорее всего, потому что вы не получили все данные файла в байтовый массив. Метод Read не должен возвращать столько байтов, сколько вы запрашиваете, и возвращает количество байтов, фактически помещенных в массив. Вы должны выполнить цикл, пока не получите все данные:

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

Это распространенная ошибка при чтении из потока. Я видел эту проблему много раз.

Edit:
С проверкой раннего конца потока, как предложил Мэтью, код будет:

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;
}
1 голос
/ 31 мая 2009

Любая причина, почему вы просто не делаете это:

Image bitmap = Image.FromStream(postedFile.InputStream);
1 голос
/ 31 мая 2009

Вы проверили возвращаемое значение из вызова Read (), чтобы убедиться, что фактически читает все содержимое? Возможно, Read () возвращает только часть потока, требуя зацикливания вызова Read () до тех пор, пока не будут использованы все байты.

1 голос
/ 31 мая 2009

Вы не проверяете возвращаемое значение postsFile.InputStream. Read . Это не вообще гарантирует заполнение массива при первом вызове. Это приведет к повреждению JPEG в данных (0 вместо содержимого файла).

0 голосов
/ 31 мая 2009

У меня были проблемы с загрузкой изображений в .NET, которые были открыты более надежными библиотеками изображений. Вполне возможно, что конкретное изображение в формате JPEG не поддерживается .NET. Файлы в формате jpeg - это не просто один из типов кодирования, существует множество возможных схем сжатия.

Вы можете попробовать его с другим изображением, которое, как вам известно, находится в поддерживаемом формате.

...