在ASP.NET中实现给图片添加文字水印是一个常见的需求,特别是在需要保护图片版权或者为图片添加额外信息时,下面将详细介绍如何使用ASP.NET和C#来实现这一功能。
确保你已经安装了Visual Studio和.NET SDK,打开Visual Studio,选择“创建新项目”,然后选择“ASP.NET Core Web应用程序”,为项目命名,WatermarkApp”,并选择合适的保存位置,点击“创建”按钮。
在这个示例中,我们将使用System.Drawing命名空间来处理图像,这个命名空间在.NET Core中不是默认包含的,所以我们需要安装一个兼容的包,比如System.Drawing.Common
。
打开项目的解决方案资源管理器,右键点击项目名称,选择“管理NuGet程序包”,在搜索框中输入“System.Drawing.Common”,找到对应的包并安装。
在项目中创建一个名为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(); } } } } }
在项目的控制器中使用这个服务,假设我们有一个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"); } } } }
为了方便测试API,可以为项目添加Swagger支持,安装Swashbuckle.AspNetCore
包,并在Startup.cs
中配置。
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
接口,上传一张图片并提供水印文字,应该能够看到返回的图片带有水印。
Q1: 如果图片格式不是JPEG怎么办?
A1: 上述代码示例中,我们使用了JPEG格式来保存带水印的图片,如果需要支持其他格式,可以在AddWatermark
方法中根据需要调整ImageFormat
参数,或者动态检测输入图片的格式并相应地设置输出格式。
Q2: 如何调整水印文字的大小、颜色或位置?
A2: 在WatermarkService
类的AddTextWatermark
方法中,可以通过修改Font
对象的属性来调整文字的大小和样式,通过修改Brush
对象来改变颜色,通过调整x
和y
的值来改变文字的位置,这些参数都可以根据具体需求进行定制。