2014-08-28 19 views
1

首先,我想说明的是,我对.NET中的成像名称空间知之甚少。尝试将两个字节数组的图像数据合并为一个WPF按钮位图

我有两个字节的图像数据数组,我想合并成一个WPF按钮的位图。我想在C#代码中做所有这些都是可能的。背景图片可以是jpeg或png,叠加图片绝对是带有透明区域的png。叠加图像是我想添加到原始图像中的“已售出”横幅之一。我有一个函数可以将图像转换为button.background将要处理的东西。

我试过这两个图像,它工作得很好。接下来的部分是由于我不熟悉.Net中的图像处理而让我难以接受。我已经看到了关于RenderTargetBitmap的一些信息,但是我一直无法弄清楚如何获得基本/背景位图来渲染第二个位图,也许还有另一种方法。这里是我从之前的编码器/项目继承的函数的副本。

我必须采取的字节数组转换过来的东西,我可以直接分配给button.background:

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生成为我可以“添加”/合并第二个覆盖图像的东西,然后将其转换为可用于按钮背景的格式?我知道这是一个很大的问题,但我很难过,而且我在试图弄清楚的时候感到沮丧!

回答

0

最简单的方法就是把两个堆叠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; 
    } 
} 
+0

抱歉耽搁...但你给了我正要想办法的。 ..它的工作方式,我需要非常感谢... – 2014-09-03 13:09:29

相关问题