尝试将图像数据的两个字节数组组合为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转换为我可以"添加"/合并第二个覆盖图像的东西,然后将其转换为可用于按钮背景的格式呢?我知道这是一个很大的问题,但我被难住了,我在试图弄清楚它时感到沮丧!
最简单的方法是放置两个堆叠的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;
}
}