圖片合成範例

 

直接看我的範例,註解裡有附說明

using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        BitmapEncoder BitmapEncoder = new PngBitmapEncoder();
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            //設定render圖片的寬高
            int colorWidth = (int)imgIcon.Source.Width;
            int colorHeight = (int)imgIcon.Source.Height;

            if (imgBackground.ActualHeight >= imgIcon.ActualHeight)
            {
                colorHeight = (int)imgBackground.ActualHeight;
            }
            else
            {
                colorHeight = (int)imgIcon.ActualHeight;
            }

            if (imgBackground.ActualWidth >= imgIcon.ActualWidth)
            {
                colorWidth = (int)imgBackground.ActualWidth;
            }
            else
            {
                colorWidth = (int)imgIcon.ActualWidth;
            }

            //新增一個colorWidth*colorHeight大小的影像與背景合併區,用來將 Visual 物件轉換成點陣圖
            var renderBitmap = new RenderTargetBitmap(colorWidth, colorHeight, 96.0, 96.0, PixelFormats.Pbgra32);

            var dv = new DrawingVisual();//DrawingVisual 為視覺物件,可用於在螢幕上呈現向量圖形。內容由系統保存。
            using (var dc = dv.RenderOpen())//開啟用於呈現的 DrawingVisual 物件。傳回的 DrawingContext 值可用來操作 DrawingVisual 中呈現。
            {
                //使用 Visual 繪製區域。
                var backdropBrush = new VisualBrush(imgBackground);//Controls.image也是Visual物件的一種
                //DrawRectangle(用來填滿矩形的筆刷,用來將矩形描邊的畫筆,要繪製的矩形);
                //注意第三參數「要繪製的矩形」,其參數指定寬高如果比原始圖檔還小時,則會依個別寬高比例等比縮小,反之,則放大。
                dc.DrawRectangle(backdropBrush, null, new Rect(new Point(), new Size((int)imgBackground.ActualWidth, (int)imgBackground.ActualWidth)));

                var cameraBrush = new VisualBrush(imgIcon);
                dc.DrawRectangle(cameraBrush, null, new Rect(new Point(), new Size(imgIcon.ActualWidth, imgIcon.ActualWidth)));
            }

            renderBitmap.Render(dv);//呈現 Visual 物件。

            BitmapEncoder.Frames.Add(BitmapFrame.Create(renderBitmap));

            Window1 Window1 = new Window1(BitmapEncoder);
            Window1.Owner = (Window1)this.Owner;
            Window1.Show();
            Close();
        }
    }
}

範例檔