Невозможно создать OpacityMask из Byte[]

У меня есть прямоугольник, для которого я хочу установить OpacityMask. Я попробовал это прямо из изображения PNG, которое работало. Но поскольку мое изображение поступает из базы данных позже, я попытался сначала сохранить PNG в массив, а затем восстановить из него BitmapImage. Это то, что у меня есть сейчас:

bodenbitmap = new BitmapImage();
bodenbitmap.BeginInit();
bodenbitmap.UriSource = new Uri(@"C:\bla\plan.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 для прямоугольника, но он никогда не заполняется. Однако он полностью правильно заполнен серым цветом, когда я не устанавливаю OpacityMask, и заполняется правильной OpacityMask, когда я устанавливаю его непосредственно из BitmapImage. Но, как я уже сказал, в моем реальном сценарии мне нужно прочитать изображение из базы данных, поэтому я не могу сделать это таким образом.

Любые идеи по этому поводу?


person Lorgarn    schedule 14.08.2014    source источник
comment
Что не так с этим кодом? mybmp нигде не объявлен.   -  person H.B.    schedule 14.08.2014
comment
Я исправил это. Я попытался установить OpacityMask непосредственно из источника изображения и создал новое растровое изображение из источника изображения, которое затем установил как OpacityMask, поэтому в моем источнике указано неправильное имя объекта.   -  person Lorgarn    schedule 14.08.2014


Ответы (1)


Проблема в том, что MemoryStream, созданный из imagedata, закрывается до фактического декодирования 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);
}
person Clemens    schedule 14.08.2014