当前位置:首页 > 行业动态 > 正文

Aspnet如何实现图片文字水印的简易添加?

在ASP.NET中,你可以使用System.Drawing命名空间下的类和方法来实现给图片增加文字水印的功能。

在ASP.NET中实现给图片添加文字水印是一个常见的需求,特别是在需要保护图片版权或者为图片添加额外信息时,下面将详细介绍如何使用ASP.NET和C#来实现这一功能。

创建ASP.NET项目

确保你已经安装了Visual Studio和.NET SDK,打开Visual Studio,选择“创建新项目”,然后选择“ASP.NET Core Web应用程序”,为项目命名,WatermarkApp”,并选择合适的保存位置,点击“创建”按钮。

添加必要的NuGet包

在这个示例中,我们将使用System.Drawing命名空间来处理图像,这个命名空间在.NET Core中不是默认包含的,所以我们需要安装一个兼容的包,比如System.Drawing.Common

打开项目的解决方案资源管理器,右键点击项目名称,选择“管理NuGet程序包”,在搜索框中输入“System.Drawing.Common”,找到对应的包并安装。

Aspnet如何实现图片文字水印的简易添加?

编写代码添加水印

1 创建一个服务类

在项目中创建一个名为WatermarkService的类,用于处理图片水印的逻辑。

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
namespace WatermarkApp.Services
{
    public class WatermarkService
    {
        public byte[] AddTextWatermark(byte[] imageBytes, string watermarkText)
        {
            using (var image = Image.FromStream(new MemoryStream(imageBytes)))
            {
                // 创建一个Graphics对象
                using (var graphics = Graphics.FromImage(image))
                {
                    // 设置水印文字的字体和颜色
                    Font font = new Font("Arial", 20, FontStyle.Bold);
                    Brush brush = Brushes.White;
                    // 计算文字的位置,使其位于图片底部中央
                    int x = image.Width / 2 TextRenderer.MeasureText(graphics, watermarkText, font).Width / 2;
                    int y = image.Height 10; // 留一些边距
                    // 绘制文字到图片上
                    graphics.DrawString(watermarkText, font, brush, new PointF(x, y));
                }
                // 将带水印的图片保存到内存流中
                using (var memoryStream = new MemoryStream())
                {
                    image.Save(memoryStream, ImageFormat.Jpeg);
                    return memoryStream.ToArray();
                }
            }
        }
    }
}

2 在控制器中使用服务

在项目的控制器中使用这个服务,假设我们有一个HomeController

using Microsoft.AspNetCore.Mvc;
using System.IO;
using WatermarkApp.Services;
namespace WatermarkApp.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class HomeController : ControllerBase
    {
        private readonly WatermarkService _watermarkService;
        public HomeController(WatermarkService watermarkService)
        {
            _watermarkService = watermarkService;
        }
        [HttpPost("AddWatermark")]
        public IActionResult AddWatermark([FromForm] IFormFile image, [FromForm] string watermarkText)
        {
            if (image == null || image.Length == 0)
            {
                return BadRequest("请上传有效的图片文件");
            }
            using (var memoryStream = new MemoryStream())
            {
                image.CopyTo(memoryStream);
                var watermarkedImage = _watermarkService.AddTextWatermark(memoryStream.ToArray(), watermarkText);
                return File(watermarkedImage, "image/jpeg");
            }
        }
    }
}

配置Swagger(可选)

为了方便测试API,可以为项目添加Swagger支持,安装Swashbuckle.AspNetCore包,并在Startup.cs中配置。

Aspnet如何实现图片文字水印的简易添加?

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "Watermark API", Version = "v1" });
    });
    services.AddSingleton<WatermarkService>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseSwagger();
    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Watermark API v1"));
    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

运行项目并测试

现在可以运行项目,并通过Swagger UI或者其他工具(如Postman)来测试AddWatermark接口,上传一张图片并提供水印文字,应该能够看到返回的图片带有水印。

FAQs

Q1: 如果图片格式不是JPEG怎么办?

A1: 上述代码示例中,我们使用了JPEG格式来保存带水印的图片,如果需要支持其他格式,可以在AddWatermark方法中根据需要调整ImageFormat参数,或者动态检测输入图片的格式并相应地设置输出格式。

Aspnet如何实现图片文字水印的简易添加?

Q2: 如何调整水印文字的大小、颜色或位置?

A2: 在WatermarkService类的AddTextWatermark方法中,可以通过修改Font对象的属性来调整文字的大小和样式,通过修改Brush对象来改变颜色,通过调整xy的值来改变文字的位置,这些参数都可以根据具体需求进行定制。