C# 尝试将图像数据的两字节数组合并为WPF按钮的一个位图
首先,我想声明我对.Net中的图像名称空间知之甚少 我有两个字节的图像数据数组,我想合并成一个WPF按钮的位图。我想在C代码中做这一切都是可能的。背景图像是jpeg或png,叠加图像肯定是带有透明区域的png。覆盖图像是一个已售罄的横幅,我想添加到原始图像之一。我有一个函数,可以将任一图像转换为button.background可以处理的内容 我已经尝试了这两个图像,它的作品刚刚好。下一部分是由于我不熟悉.Net中的图像处理,这让我感到困惑。我已经看到了一些关于RenderTargetBitmap的内容,但是我还没有弄清楚如何将基础/背景位图放入其中,以便在顶部渲染第二个位图,也许还有另一种方法。这是我从以前的编码器/项目继承的函数的副本 我必须将字节数组转换为可以直接分配给按钮的内容。背景:C# 尝试将图像数据的两字节数组合并为WPF按钮的一个位图,c#,wpf,image,bitmap,processing,C#,Wpf,Image,Bitmap,Processing,首先,我想声明我对.Net中的图像名称空间知之甚少 我有两个字节的图像数据数组,我想合并成一个WPF按钮的位图。我想在C代码中做这一切都是可能的。背景图像是jpeg或png,叠加图像肯定是带有透明区域的png。覆盖图像是一个已售罄的横幅,我想添加到原始图像之一。我有一个函数,可以将任一图像转换为button.background可以处理的内容 我已经尝试了这两个图像,它的作品刚刚好。下一部分是由于我不熟悉.Net中的图像处理,这让我感到困惑。我已经看到了一些关于RenderTargetBitma
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;
}
}