Массив байтов отпечатков пальцев для источника изображения в WPF

Я пытаюсь преобразовать массив байтов отпечатков пальцев в источник изображения в приложении WPF, но мои трюки не работают. Вот код:

  byte[] fp_image;  //fp_image contains the fingerprint byte array result 

  using (MemoryStream ms = new MemoryStream(fp_image))
  {
      Bitmap bmp = new Bitmap(ms);
      FpImage.Source = ConvertToImageSource(bmp);
  }
  public static ImageSource ConvertToImageSource(Bitmap bitmap)
  {
     var imageSourceConverter = new ImageSourceConverter();
     using (var memoryStream = new MemoryStream())
     {
         bitmap.Save(memoryStream, ImageFormat.Png);
         var snapshotBytes = memoryStream.ToArray();
         return (ImageSource)imageSourceConverter.ConvertFrom(snapshotBytes); ;
     }
  }

Примечание. Если я преобразую любое другое изображение в массив байтов и преобразую его обратно в изображение с помощью этого кода, он работает.


person Dhruv Gohil    schedule 29.07.2017    source источник
comment
byte[] fp_image содержит обязательные заголовки изображений? например, вы пытаетесь сохранить в png, но у него есть заголовок файла png?   -  person Hasan Emrah Süngü    schedule 29.07.2017
comment
@EmrahSüngü нет, он не содержит заголовков. Если он должен содержать, как я могу назначить заголовок изображения для byte[] fp_image   -  person Dhruv Gohil    schedule 29.07.2017
comment
Весь этот код с Winforms System.Drawing.Bitmap не имеет смысла. Если fp_image содержит допустимый кадр растрового изображения (закодированный, например, как PNG или JPEG), вы можете напрямую передать его конструктору MemoryStream и назначить этот поток свойству StreamSource объекта WPF BitmapImage. Если fp_image является необработанным пиксельным буфером, вам необходимо знать формат пикселя, ширину и высоту растрового изображения и передать эти значения в одну из перегрузок BitmapSource.Create().   -  person Clemens    schedule 29.07.2017


Ответы (1)


Предполагая, что byte[] fp_image содержит необработанные данные, вы можете напрямую создать BitmapSource (который является подклассом ImageSource) с помощью метода, показанного ниже. Однако вам нужно знать ширину, высоту и формат пикселей растрового изображения в вашем буфере.

public BitmapSource GetBitmapFromRawBytes(
    byte[] rawBytes, int width, int height, PixelFormat format)
{
    var stride = (width * format.BitsPerPixel + 7) / 8;
    return BitmapSource.Create(width, height, 96, 96, format, null, rawBytes, stride);
}
person Hasan Emrah Süngü    schedule 29.07.2017
comment
Marshal.UnsafeAddrOfPinnedArrayElement это ерунда. Передайте rawBytesнапрямую BitmapSource.Create(), чтобы создать WPF BitmapSource. И сказал ли ОП что-нибудь о том, знают ли они ширину, высоту и формат пикселей? - person Clemens; 29.07.2017
comment
Мне жаль. Я не понимаю, почему это ерунда. Я предложил рабочее решение. Я не вижу, как я могу использовать ваше решение. - person Hasan Emrah Süngü; 29.07.2017
comment
Я отредактировал ваш ответ, так что ваш пример создает WPF BitmapSource, а не растровое изображение WinForms. Ваше решение также предполагает фиксированный формат пикселей. Вместо этого это также должно быть передано как параметр, как ширина и высота. Однако шаг можно рассчитать. - person Clemens; 29.07.2017
comment
Все это по-прежнему требует, чтобы OP знал ширину, высоту и формат, чего мы не знаем. - person Clemens; 29.07.2017
comment
Пожалуйста, держите его читабельным. Это C#, мы пишем открывающие фигурные скобки с новой строки. - person Clemens; 29.07.2017
comment
Скобки на новой строке - это правило С#? Я всегда предполагал, что это предпочтение - person Hasan Emrah Süngü; 29.07.2017
comment
Это очень широко распространенное соглашение, как и другой способ для Java. - person Clemens; 29.07.2017