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#中global关键字的作用及其用法

    在C#中global关键字的作用及其用法 在C#中,global关键字可以用来指示某个标识符是全局的,从而可以在任何地方都可以访问到。 用法一:全局命名空间 在C#中,全局命名空间是由所有不属于其他命名空间的类型、函数和变量组成的空间。可以使用global关键字来引用全局命名空间中的类型或变量,例如: global::System.Console.Write…

    C# 2023年5月15日
    00
  • 深入多线程之:深入生产者、消费者队列分析

    深入多线程之:深入生产者、消费者队列分析 为什么需要生产者、消费者队列? 在多线程编程中,生产者、消费者队列是一种常用的线程同步机制。这种机制基于一个队列,生产者线程往队列中添加元素,而消费者线程则从队列中读取元素。通过生产者向队列中添加元素,消费者从队列中取出元素的操作可以实现生产者与消费者之间的同步,并避免了线程之间的竞争。 生产者、消费者队列通常应用于…

    C# 2023年6月6日
    00
  • 外键拆分手记

    我习惯性使用OData,它的$expand与层级查询非常好用,这个功能非常依赖于数据库的导航属性,也就是外键结构。最近想着把一个单体的系统拆分为多个小系统,首先需要处理外键依赖的问题。 多个服务各自有各自的数据库,数据库层面并不互通,也就无法使用外键约束。 我使用EF Core来描述数据库的结构,有两个实体类如下: public class AD_Insec…

    C# 2023年4月27日
    00
  • C#通过经纬度计算2个点之间距离的实现代码

    计算两个点之间的距离通常使用地理坐标系中的经纬度作为计算的基础。下面是C#实现经纬度计算距离的完整攻略: 步骤一:确定计算方法 在地图中,经纬度之间的直线距离可以使用大圆距离公式(Haversine formula)计算。该公式将两点之间的直线距离表示为球面距离,考虑地球的尺寸与弧度的转换,计算公式如下: dist = 2R * arcsin(sqrt(si…

    C# 2023年5月31日
    00
  • C#如何判断.Net Framework版本是否满足软件运行需要的版本

    要判断C#程序所依赖的.NET Framework版本是否满足软件运行需要的版本,可以使用System.Runtime.Versioning命名空间中的FrameworkName类来实现。具体步骤如下: 引入System.Runtime.Versioning命名空间 在C#程序的代码文件中,添加using语句,引入System.Runtime.Version…

    C# 2023年6月6日
    00
  • C#判断三角形的类型

    想要判断一个三角形的类型,我们需要知道它的三条边长。以下是判断三角形类型的完整攻略: 步骤一:获取三角形的边长 需要获取三角形三条边的长度,可以通过用户输入、数据库或者其他数据源来获得。在此示例中,我们假设有三个变量 a、b、c 分别存储三角形的三条边长。 步骤二:判断是否为三角形 要判断一个三角形的类型,首先需要确定它是否是三角形。三角形的判定规则是任意两…

    C# 2023年6月7日
    00
  • centos7下安装并配置supervisor守护程序的操作方法

    在CentOS 7下安装并配置Supervisor守护程序的操作方法如下: 安装Supervisor 在命令行中执行以下命令,使用yum包管理器安装Supervisor: sudo yum install supervisor 配置Supervisor 在CentOS 7中,Supervisor的配置文件位于/etc/supervisord.conf。我们可…

    C# 2023年5月17日
    00
  • C#子线程执行完后通知主线程的方法

    Sure,关于“C#子线程执行完后通知主线程的方法”,目前主流的解决方法有以下几种: 1. 使用System.Threading.Tasks.Task机制 Tasks是.NET Framework中一种比传统线程更高效、更易于使用的并发编程模型。使用Task机制,可使线程的启动和执行过程简单高效,同时还可通过Task状态监视线程的执行情况,以及异步获取线程的…

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