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

本文关键字:位图 组合 一个 WPF 数组 按钮 两个 图像 数据 字节 字节数 | 更新日期: 2023-09-27 18:19:41

首先,我想声明,我对.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;
}

我定义了一个新的类,它继承了按钮调用CategoryButton,它还有一些其他的错误。属性。当我用以下代码创建按钮时,我可以成功地将任一图像作为按钮的背景:

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

所以我知道这个函数足够好用。但是,如何将字节数组或生成的ImageBrush转换为我可以"添加"/合并第二个覆盖图像的东西,然后将其转换为可用于按钮背景的格式呢?我知道这是一个很大的问题,但我被难住了,我在试图弄清楚它时感到沮丧!

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

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

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

并且仅将适当的ImageSource分配给每个控件的Source

如果你真的需要将这两张图像合并为一张,你可以这样做:

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;
    }
}