2014-08-28 20 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

相關問題