2017-07-29 48 views
0

我想转换指纹字节数组到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); ; 
    } 
    } 

注:如果我转换其他任何图像字节数组,并使用此代码它的工作将其转换回图像。

+0

'byte [] fp_image'包含所需的图像头?例如你试图保存到PNG,但它有PNG文件头? –

+0

@EmrahSüngü不,它不包含任何标题。如果它应该包含,我如何将图像头部分配给字节[] fp_image –

+0

Winforms System.Drawing.Bitmap的所有代码都没有意义。如果'fp_image'包含有效的位图帧(编码为PNG或JPEG),则可以直接将其传递给MemoryStream构造函数,并将该流分配给WPF BitmapImage的'StreamSource'属性。如果'fp_image'是一个原始像素缓冲区,则需要知道位图的像素格式,宽度和高度,并将这些值传递给BitmapSource.Create()重载之一。 – Clemens

回答

0

假设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); 
} 
+0

'Marshal.UnsafeAddrOfPinnedArrayElement'是无稽之谈。将'rawBytes'直接传递给'BitmapSource.Create()'来创建一个** WPF ** BitmapSource。 OP是否告诉他们是否知道宽度,高度和像素格式? – Clemens

+0

对不起。我不明白为什么这是无稽之谈。我提供了一个工作解决方案我不明白我可以如何使用您的解决方案。 –

+0

我编辑了您的答案,以便您的示例创建一个WPF BitmapSource,而不是WinForms位图。您的解决方案也采用固定的像素格式。这应该作为参数传递,就像宽度和高度一样。然而,步幅可以被计算。 – Clemens