如何在Xamarin Forms中实现仅给用户截图添加水印的功能
Xamarin.Forms 截图自动加水印实现方案
这个需求完全可以实现,核心逻辑是双平台分别监听系统截图事件,在内存中对原始截图叠加水印后替换原文件,全程不会在应用正常界面渲染任何水印元素,不影响用户正常使用。
前置权限要求
- Android:Android 13及以上需申请
READ_MEDIA_IMAGES权限,低版本申请READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE权限 - iOS:需在Info.plist中配置相册访问权限说明
NSPhotoLibraryAddUsageDescription、NSPhotoLibraryUsageDescription
各平台实现思路
Android 端实现
- 注册内容观察者监听媒体库更新事件,过滤路径包含
screenshot、截屏关键词的新增文件,确认是用户生成的截图 - 读取原始截图文件转成Bitmap,调用Canvas API叠加文字/图片水印,示例代码:
public Bitmap AddWatermark(Bitmap originalBitmap, string watermarkText) { var outputBitmap = Bitmap.CreateBitmap(originalBitmap.Width, originalBitmap.Height, originalBitmap.GetConfig()); var canvas = new Canvas(outputBitmap); // 绘制原始截图 canvas.DrawBitmap(originalBitmap, 0, 0, null); // 配置水印画笔 var paint = new Paint { Color = Android.Graphics.Color.ParseColor("#80FFFFFF"), TextSize = 80, AntiAlias = true }; // 绘制水印,可自定义位置、样式 canvas.DrawText(watermarkText, 100, originalBitmap.Height - 200, paint); return outputBitmap; }
- 将加好水印的Bitmap覆盖原截图文件,或插入媒体库替换原始截图即可
iOS 端实现
- 注册系统通知
UIApplication.UserDidTakeScreenshotNotification监听截图完成事件 - 读取相册最新生成的截图,调用CoreGraphics API叠加水印,示例代码:
public UIImage AddWatermark(UIImage originalImage, string watermarkText) { UIGraphics.BeginImageContextWithOptions(originalImage.Size, false, 0); // 绘制原始截图 originalImage.Draw(new CGRect(0, 0, originalImage.Size.Width, originalImage.Size.Height)); // 配置水印属性 var textAttributes = new UIStringAttributes { Font = UIFont.SystemFontOfSize(40), ForegroundColor = UIColor.White.ColorWithAlpha(0.5f) }; // 绘制水印 watermarkText.DrawString(new CGRect(100, originalImage.Size.Height - 200, originalImage.Size.Width - 200, 100), textAttributes); var outputImage = UIGraphics.GetImageFromCurrentImageContext(); UIGraphics.EndImageContext(); return outputImage; }
- 将加好水印的图片替换相册中原截图即可
Xamarin.Forms 层统一调用
通过DependencyService封装双平台的监听、水印处理服务,在共享层统一调用即可,可统一配置水印内容、位置、透明度等参数,适配不同业务需求。
内容的提问来源于stack exchange,提问作者Rohit Chauhan
相关产品推荐
相关产品推荐

