WPF实现图片合成或加水印的方法【2种方法】

WPF实现图片合成或加水印的方法【2种方法】

在WPF中实现图片合成或加水印可以通过以下两种方法:

  1. 利用DrawImage方法进行图片合成;
  2. 通过混合模式来实现水印效果。

一、利用DrawImage方法进行图片合成

在WPF中,可以使用DrawImage方法将一张图片绘制到另一张图片上,实现图片的合成。具体步骤如下:

  1. 在XAML中添加一个Image控件,指定图片的Source属性;
  2. 在代码中从文件中加载需要合成的图片,将其绘制到Image控件所绑定的图片上;
  3. 通过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中的混合模式可以将一个元素的表现效果与其周围的元素合并,可以使用它来实现水印效果。具体步骤如下:

  1. 在XAML中添加一个Image控件,指定图片的Source属性;
  2. 在代码中创建一个带有水印文本的DrawingVisual对象;
  3. 将原始图片和水印文本绘制到RenderTargetBitmap中;
  4. 通过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技术站

(1)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#中关于double.ToString()的用法

    下面是关于C#中double.ToString()用法的完整攻略。 double.ToString() 介绍 double.ToString() 是一个用于将 double 类型的变量转换为字符串的方法。在 C# 中,ToString() 方法通常用于将不同类型的变量转换为字符串,以便更容易地输出、处理或者保存。 使用 double.ToString() 方…

    C# 2023年6月7日
    00
  • 函数指针的一些概念详解

    函数指针的一些概念详解 什么是函数指针? 函数指针实际上就是一个指针变量,它指向的是一个函数。指针变量可以用来存储函数的地址,当程序需要调用该函数时,可以通过函数指针来访问该函数。 声明函数指针的语法如下: 返回类型 (*指针变量名)(参数类型1, 参数类型2, … , 参数类型n) 下面是一个简单的例子: #include <stdio.h&gt…

    C# 2023年6月7日
    00
  • ASP.NET Core2读写InfluxDB时序数据库的方法教程

    ASP.NET Core2读写InfluxDB时序数据库的方法教程 InfluxDB是一个开源的时序数据库,它专门用于存储和查询时间序列数据。在本攻略中,我们将详细讲解如何在ASP.NET Core2应用程序中读写InfluxDB时序数据库。 步骤一:安装InfluxDB 在开始之前,您需要安装InfluxDB。您可以从InfluxDB官网下载并安装最新版本…

    C# 2023年5月17日
    00
  • .NET Core开源 DDD微服务 支持 多租户 单点登录 多级缓存、自动任务、分布式、日志、授权和鉴权 、网关 、注册与发现 系统架构 docker部署

    源代码地址https://github.com/junkai-li/NetCoreKevin基于NET6搭建跨平台DDD思想WebApi架构、IDS4单点登录、多缓存、自动任务、分布式、多租户、日志、授权和鉴权、CAP、SignalR、 docker部署  如需简约项目可直接去除项目引用 解耦设计都可以单独引用 架构默认全部引用并启动 项目启动时注意相关 R…

    C# 2023年4月24日
    00
  • .NET Core使用HttpClient进行表单提交时遇到的问题

    下面就为大家演示如何解决“.NET Core使用HttpClient进行表单提交时遇到的问题”。 问题描述 在使用.NET Core中的HttpClient类进行表单提交时,有时会遇到以下问题: 无法正确获取POST请求的参数,导致返回错误数据 POST请求无法发送,返回HTTP 405错误 发送POST请求时,由于未正确设置请求头信息,服务器未能正确处理该…

    C# 2023年6月3日
    00
  • C#基础:Dispose()、Close()、Finalize()的区别详解

    标题:C#基础:Dispose()、Close()、Finalize()的区别详解 介绍:在C#中,Dispose()、Close()、Finalize()都是释放资源的方式,但是它们之间有着不同的使用场景和语义。本文将对这三者进行详细介绍,并给出使用示例。 正文:一、Dispose()Dispose()是一种显式释放资源的方法,它是IDisposable接…

    C# 2023年5月15日
    00
  • C#读取数据库返回泛型集合详解(DataSetToList)

    C#读取数据库返回泛型集合是一种常见的数据访问方式,可以快速、高效地将数据库里的数据以泛型集合的方式返回给程序,本文将详细讲解如何使用DataSetToList实现这一功能。 准备工作 在使用DataSetToList读取数据库前,需要进行一些准备工作,具体如下: 1.引用相关命名空间 在代码文件中,需要引用以下命名空间: using System.Data…

    C# 2023年5月31日
    00
  • Visual Studio怎么重新配置开发环境?

    对于如何重新配置 Visual Studio 开发环境,我可以提供以下步骤: 步骤一:打开Visual Studio Installer 首先,需要打开 Visual Studio Installer,可以在 Windows 开始菜单中搜索找到该程序并打开。如果没有安装 Visual Studio Installer,可以前往 Visual Studio 官…

    C# 2023年6月7日
    00
合作推广
合作推广
分享本页
返回顶部