我有一个矩形,我想为它设置一个不透明度。我直接从PNG图像中尝试了它,它正在工作。但由于我的图像稍后来自数据库,我尝试先将PNG保存到数组中,然后从中恢复BitmapImage。这是我现在的代码:
bodenbitmap = new BitmapImage();
bodenbitmap.BeginInit();
bodenbitmap.UriSource = new Uri(@"C:blaplan.png", UriKind.Relative);
bodenbitmap.EndInit();
PngBitmapEncoder enc = new PngBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bodenbitmap));
using (MemoryStream ms = new MemoryStream())
{
enc.Save(ms);
imagedata = ms.ToArray();
}
ImageSource src = null;
using (MemoryStream ms = new MemoryStream(imagedata))
{
if (ms != null)
{
ms.Seek(0, SeekOrigin.Begin);
PngBitmapDecoder decoder = new PngBitmapDecoder(ms, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
src = decoder.Frames[0];
}
}
Rectangle rec = new Rectangle();
rec.OpacityMask = new ImageBrush(src);
rec.Fill = new SolidColorBrush(Colors.Gray);
我可以从ImageSource中为矩形设置高度和宽度,但它永远不会被填充。然而,当我没有设置不透明掩码时,它被正确地完全填充为灰色,当我直接从BitmapImage设置它时,它被正确地填充为不透明掩码。但正如我所说,在我的现实世界的场景中,我必须从数据库中读取图像,所以我不能这样做。
对此有什么想法吗?
问题是,从imagedata
创建的MemoryStream在BitmapFrame实际解码之前被关闭。
您必须将BitmapCacheOption从BitmapCacheOption.Default
更改为BitmapCacheOption.OnLoad
:
using (MemoryStream ms = new MemoryStream(imagedata))
{
PngBitmapDecoder decoder = new PngBitmapDecoder(
ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
src = decoder.Frames[0];
}
或短:
using (var ms = new MemoryStream(imagedata))
{
src = BitmapFrame.Create(ms, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}