WPF实现图片合成或加水印的方法【2种方法】
在WPF中实现图片合成或加水印可以通过以下两种方法:
- 利用DrawImage方法进行图片合成;
- 通过混合模式来实现水印效果。
一、利用DrawImage方法进行图片合成
在WPF中,可以使用DrawImage方法将一张图片绘制到另一张图片上,实现图片的合成。具体步骤如下:
- 在XAML中添加一个Image控件,指定图片的Source属性;
- 在代码中从文件中加载需要合成的图片,将其绘制到Image控件所绑定的图片上;
- 通过Save方法将合成后的图片保存到文件或内存中。
代码示例:
private void ComposeImage(string baseImagePath, string overlayImagePath, string outputPath)
{
using (FileStream baseFileStream = new FileStream(baseImagePath, FileMode.Open, FileAccess.Read))
{
BitmapImage baseImage = new BitmapImage();
baseImage.BeginInit();
baseImage.StreamSource = baseFileStream;
baseImage.CacheOption = BitmapCacheOption.OnLoad;
baseImage.EndInit();
using (FileStream overlayFileStream = new FileStream(overlayImagePath, FileMode.Open, FileAccess.Read))
{
BitmapImage overlayImage = new BitmapImage();
overlayImage.BeginInit();
overlayImage.StreamSource = overlayFileStream;
overlayImage.CacheOption = BitmapCacheOption.OnLoad;
overlayImage.EndInit();
DrawingVisual drawingVisual = new DrawingVisual();
using (DrawingContext drawingContext = drawingVisual.RenderOpen())
{
drawingContext.DrawImage(baseImage, new Rect(0, 0, baseImage.PixelWidth, baseImage.PixelHeight));
drawingContext.DrawImage(overlayImage, new Rect(0, 0, overlayImage.PixelWidth, overlayImage.PixelHeight));
}
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(baseImage.PixelWidth, baseImage.PixelHeight, baseImage.DpiX, baseImage.DpiY, PixelFormats.Default);
renderTargetBitmap.Render(drawingVisual);
BitmapEncoder bitmapEncoder = new PngBitmapEncoder();
bitmapEncoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
using (FileStream fileStream = new FileStream(outputPath, FileMode.Create))
{
bitmapEncoder.Save(fileStream);
}
}
}
}
二、通过混合模式来实现水印效果
WPF中的混合模式可以将一个元素的表现效果与其周围的元素合并,可以使用它来实现水印效果。具体步骤如下:
- 在XAML中添加一个Image控件,指定图片的Source属性;
- 在代码中创建一个带有水印文本的DrawingVisual对象;
- 将原始图片和水印文本绘制到RenderTargetBitmap中;
- 通过Save方法将合成后的图片保存到文件或内存中。
代码示例:
private void AddTextWatermark(string imagePath, string watermarkText, string outputPath)
{
using (FileStream fileStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read))
{
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = fileStream;
bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
bitmapImage.EndInit();
DrawingVisual drawingVisual = new DrawingVisual();
using (DrawingContext drawingContext = drawingVisual.RenderOpen())
{
drawingContext.DrawImage(bitmapImage, new Rect(0, 0, bitmapImage.PixelWidth, bitmapImage.PixelHeight));
FormattedText formattedText = new FormattedText(watermarkText,
CultureInfo.CurrentCulture,
FlowDirection.LeftToRight,
new Typeface("Arial"),
16,
Brushes.White);
drawingContext.DrawText(formattedText, new Point(15, bitmapImage.PixelHeight - 30));
}
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(bitmapImage.PixelWidth, bitmapImage.PixelHeight, bitmapImage.DpiX, bitmapImage.DpiY, PixelFormats.Default);
renderTargetBitmap.Render(drawingVisual);
BitmapEncoder bitmapEncoder = new PngBitmapEncoder();
bitmapEncoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
using (FileStream outputStream = new FileStream(outputPath, FileMode.Create))
{
bitmapEncoder.Save(outputStream);
}
}
}
以上就是WPF实现图片合成或加水印的两种方法的完整攻略,希望能对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:WPF实现图片合成或加水印的方法【2种方法】 - Python技术站