我有一个包含黑白图像的结构:
public class Img
{
public int height;
public int width;
public byte[] matrix;
}
矩阵中包含的值为0或255。
使用C#WPF在组件中显示此图像的最佳方法是什么?
我试过这个:
XAML:
<Image Grid.Row="0"
Stretch="Uniform"
Source="{Binding Picture, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/>
C#:
public BitmapImage Picture
{
get
{
return _picture;
}
private set
{
_picture = value;
OnPropertyChanged("Picture");
}
}
public void Generate()
{
Img img = CreateImg();
Picture = LoadImage(img.width, img.height, img.matrix);
}
private BitmapImage LoadImage(int w, int h, byte[] imageData)
{
using (MemoryStream memory = new MemoryStream(imageData))
{
memory.Position = 0;
BitmapImage bitmapimage = new BitmapImage();
bitmapimage.BeginInit();
bitmapimage.StreamSource = memory;
bitmapimage.EndInit();
return bitmapimage;
}
}
但它不起作用:
&#34;来自HRESULT的异常:0x88982F50&#34;
答案 0 :(得分:5)
BitmapImage.StreamSource
属性仅接受包含编码位图缓冲区的流,例如PNG或JPEG。
要从原始像素数据创建BitmapSource
(基类BitmapImage
),您可以使用BitmapSource.Create()
方法。根据每个像素的位数以及Alpha和颜色通道的顺序,您还必须选择合适的PixelFormat
。
假设有一个8位灰度格式,你可以像这样创建一个BitmapSource:
private BitmapSource LoadImage(int width, int height, byte[] imageData)
{
var format = PixelFormats.Gray8;
var stride = (width * format.BitsPerPixel + 7) / 8;
return BitmapSource.Create(width, height, 96, 96, format, null, imageData, stride);
}
当然,您还必须将您的媒体资源类型更改为BitmapSource
(无论如何,这更灵活,因为您仍然可以指定BitmapImage
)。
public BitmapSource Picture { get; set; }
答案 1 :(得分:0)
尝试this:
private static BitmapImage LoadImage(byte[] imageData)
{
if (imageData == null || imageData.Length == 0) return null;
var image = new BitmapImage();
using (var mem = new MemoryStream(imageData))
{
mem.Position = 0;
image.BeginInit();
image.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = null;
image.StreamSource = mem;
image.EndInit();
}
image.Freeze();
return image;
}