本文实例讲述了WPF实现图片合成或加水印的方法。,具体如下:
最近项目中应用多次应用了图片合成,为了今后方便特此记下。
在WPF下有两种图片合成的方式,一种还是用原来C#提供的GDI+方式,命名空间是System.Drawing 和 System.Drawing.Imaging,另一种是WPF中新添加的API,命名空间是 System.Windows.Media 和 System.Windows.Media.Imaging 。
我们来做一个简单的例子,分别用上面的两种方式实现,功能是在一个背景图上面,画一个头像,然后在写一个签名。
首先准备一张背景图(bg.jpg)和两个头像图片(tiger.png 和 lion.png)最后的生成的图片效果如下图:


把准备的素材拷贝到项目中,其文件属性【复制到输出目录】选择【始终复制】,【生成操作】选择【内容】。
这里贴一下两种方式的主要代码,具体代码可以在文章最后点击下载。
第一种方式
使用RenderTargetBitmap 和 DrawingVisual 方式
private BitmapSource MakePicture(string bgImagePath, string headerImagePath, string signature)
{
//获取背景图
BitmapSource bgImage = new BitmapImage(new Uri(bgImagePath, UriKind.Relative));
//获取头像
BitmapSource headerImage = new BitmapImage(new Uri(headerImagePath, UriKind.Relative));
//创建一个RenderTargetBitmap 对象,将WPF中的Visual对象输出
RenderTargetBitmap composeImage = new RenderTargetBitmap(bgImage.PixelWidth, bgImage.PixelHeight, bgImage.DpiX, bgImage.DpiY, PixelFormats.Default);
FormattedText signatureTxt = new FormattedText(signature,
System.Globalization.CultureInfo.CurrentCulture,
System.Windows.FlowDirection.LeftToRight,
new Typeface(System.Windows.SystemFonts.MessageFontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal),
50,
System.Windows.Media.Brushes.White);
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
drawingContext.DrawImage(bgImage, new Rect(0, 0, bgImage.Width, bgImage.Height));
//计算头像的位置
double x = (bgImage.Width / 2 - headerImage.Width) / 2;
double y = (bgImage.Height - headerImage.Height) / 2 - 100;
drawingContext.DrawImage(headerImage, new Rect(x, y, headerImage.Width, headerImage.Height));
//计算签名的位置
double x2 = (bgImage.Width/2 - signatureTxt.Width) / 2;
double y2 = y + headerImage.Height + 20;
drawingContext.DrawText(signatureTxt, new System.Windows.Point(x2, y2));
drawingContext.Close();
composeImage.Render(drawingVisual);
//定义一个JPG编码器
JpegBitmapEncoder bitmapEncoder = new JpegBitmapEncoder();
//加入第一帧
bitmapEncoder.Frames.Add(BitmapFrame.Create(composeImage));
//保存至文件(不会修改源文件,将修改后的图片保存至程序目录下)
string savePath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"合成.jpg";
bitmapEncoder.Save(File.OpenWrite(Path.GetFileName(savePath)));
return composeImage;
}










