vb.net сохранение изображения в поток памяти приводит к ArgumentNullException

В VB.NET у меня есть следующая функция, которая позволяет мне вычислить хэш для изображения, которое я еще не сохранил в файл:

Public Function pictureHash(ByVal image As System.Drawing.Image) As String
  Try
    If image Is Nothing Then Return Nothing
    Dim ha As HashAlgorithm = HashAlgorithm.Create()
    Dim ms As New MemoryStream()
    image.Save(ms, image.RawFormat)
    ms.Position = 0
    Dim imageHash As Byte() = ha.ComputeHash(ms)
    ms.Close()
    Return BitConverter.ToString(imageHash)
  Catch ex As Exception
    Return Nothing
  End Try
End Function

Проблема в том, что я получаю ArgumentNullException в инструкции image.Save(ms, image.rawFormat).

Вот детали исключения:

System.ArgumentNullException occurred
  Message="Value cannot be null. Parameter name: encoder"
  ParamName="encoder"
  Source="System.Drawing"
  StackTrace:
       at System.Drawing.Image.Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
       at System.Drawing.Image.Save(Stream stream, ImageFormat format)
       at MyProgram.pictureHash(Image image)

Дело в том, что когда я смотрю на трассировку стека, последний вызов Image.Save с 3 параметрами (тот, который дает сбой) даже не я, а предыдущий вызов Image.Save.

Есть идеи, что мне делать?

Заранее большое спасибо за помощь,

С уважением,

Joël


person Joel    schedule 28.03.2013    source источник
comment
возможный дубликат Создайте миниатюру, а затем преобразуйте в байтовый массив   -  person sloth    schedule 28.03.2013
comment
Можете ли вы предоставить какие-либо подробности о том, откуда берется изображение (например, файл, база данных и т. д.) и каков формат файла (png, bmp, jpg и т. д.)?   -  person Tim Greaves    schedule 28.03.2013
comment
@TimGreaves, изображения получены с камер (вроде сканеров штрих-кода). Некоторые из них поступают через SDK поставщика напрямую как System.Drawing.Image в формате JPEG, а другие поступают в виде байтов через несколько TCP-пакетов напрямую через сокет, открытый камерой. Во втором случае байты объединяются в уникальный массив байтов и также представляют изображение в формате JPEG.   -  person Joel    schedule 02.04.2013


Ответы (1)


Согласно содержимому сообщества для метода Image.Save некоторые форматы изображений не имеют связанного кодировщика и завершаются ошибкой, о которой вы сообщаете.

Не могли бы вы использовать стандартный формат (например, bmp или png) при сохранении файла в MemoryStream? Для этого замените вызов Save на что-то похожее на:

image.Save(ms, ImageFormat.Png)
person Tim Greaves    schedule 02.04.2013
comment
Спасибо @Tim Greaves за этот ответ. Изображение, которое я получил от поставщика SDK, должно быть в формате jpg, но на самом деле это png (если я сохраню его в файл, по заголовку я увижу, что это png). И image.rawFormat соответствовал MemomoryBmp в этом конкретном случае. Это причина, по которой он разбился с ArgumentNullException. - person Joel; 15.04.2013