C# 尝试将图像数据的两字节数组合并为WPF按钮的一个位图

C# 尝试将图像数据的两字节数组合并为WPF按钮的一个位图,c#,wpf,image,bitmap,processing,C#,Wpf,Image,Bitmap,Processing,首先,我想声明我对.Net中的图像名称空间知之甚少 我有两个字节的图像数据数组,我想合并成一个WPF按钮的位图。我想在C代码中做这一切都是可能的。背景图像是jpeg或png,叠加图像肯定是带有透明区域的png。覆盖图像是一个已售罄的横幅,我想添加到原始图像之一。我有一个函数,可以将任一图像转换为button.background可以处理的内容 我已经尝试了这两个图像,它的作品刚刚好。下一部分是由于我不熟悉.Net中的图像处理,这让我感到困惑。我已经看到了一些关于RenderTargetBitma

首先,我想声明我对.Net中的图像名称空间知之甚少

我有两个字节的图像数据数组,我想合并成一个WPF按钮的位图。我想在C代码中做这一切都是可能的。背景图像是jpeg或png,叠加图像肯定是带有透明区域的png。覆盖图像是一个已售罄的横幅,我想添加到原始图像之一。我有一个函数,可以将任一图像转换为button.background可以处理的内容

我已经尝试了这两个图像,它的作品刚刚好。下一部分是由于我不熟悉.Net中的图像处理,这让我感到困惑。我已经看到了一些关于RenderTargetBitmap的内容,但是我还没有弄清楚如何将基础/背景位图放入其中,以便在顶部渲染第二个位图,也许还有另一种方法。这是我从以前的编码器/项目继承的函数的副本

我必须将字节数组转换为可以直接分配给按钮的内容。背景:

public static BitmapImage ByteArrayToImageBrush(this 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;
}
我定义了一个新类,该类继承自button call CategoryButton,它还有一些其他杂项。财产。使用以下代码创建按钮时,我可以成功地将任一图像作为按钮的背景:

CategoryButton catbtn = new CategoryButton();
catbtn.Background = new ImageBrush(ByteArrayToImageBrush(bgImageByteArray);
// * or *
catbtn.Background = new ImageBrush(ByteArrayToImageBrush(overlayImageByteArray);

所以我知道这个函数工作得很好。但是,如何将字节数组或结果ImageBrush添加到我可以添加/合并第二个覆盖图像的内容中,然后将其转换为可用于按钮背景的格式呢?我知道这是一个很大的问题,但我被难住了,我在试图弄明白这一点时感到沮丧和沮丧

最简单的方法是放置两个堆叠的图像控件,如下所示:

<Grid>
    <Image Name="image" Stretch="None" />
    <Image Name="overlay" Stretch="None" />
</Grid>

抱歉耽搁了。。。但是用你给我的东西我就要想办法了。。。这是我需要的方式所以谢谢。。。
private static ImageSource CombineImageWithOverlay(byte[] imageBytes, byte[] overlayBytes)
{
    var image = GetImageFromBytes(imageBytes);
    var overlay = GetImageFromBytes(overlayBytes);
    var visual = new DrawingVisual();
    using (var context = visual.RenderOpen())
    {
        context.DrawImage(image, new Rect(0, 0, image.PixelWidth, image.PixelHeight));
        context.DrawImage(overlay, new Rect(0, 0, overlay.PixelWidth, overlay.PixelHeight));
    }
    var result = new RenderTargetBitmap(image.PixelWidth, image.PixelHeight, image.DpiX, image.DpiY, PixelFormats.Pbgra32);
    result.Render(visual);
    return result;
}

private static BitmapImage GetImageFromBytes(byte[] bytes)
{
    using (var stream = new MemoryStream(bytes))
    {
        var img = new BitmapImage();
        img.BeginInit();
        img.CacheOption = BitmapCacheOption.OnLoad;
        img.StreamSource = stream;
        img.EndInit();
        return img;
    }
}