.NET 个人博客-给图片添加水印
个人博客-给图片添加水印
前言
需要用到的库
SixLabors.lmageSharp 2.1.3
SixLabors.lmageSharp.Web 2.0.2
SixLabors.Fonts 1.0.0-beta19
SixLabors.lmageSharp.Drawing 1.0.0-beta15
注意:该项目为.NET6 Core项目
开始实现
首先需要有Image对象和IImageFormat对象,可以通过以下代码获取:
//imagePath 图片路径
await using var fileStream = new FileStream(imagePath, FileMode.Open);
var (image, format) = await Image.LoadWithFormatAsync(fileStream);
//调用
await GenerateImageResponse(image,format)
注意:如果部署到liunx系统上,记得修改字体~
方法一 直接使用DrawText添加水印
然后就可以写返回图片流的接口了,如下:
private static async Task<IActionResult> GenerateImageResponse(Image image, IImageFormat format)
{
//获取图像的编码器,用于保存图像到流中
var encoder = image.GetConfiguration().ImageFormatsManager.FindEncoder(format);
//创建一个内存流来保存图像数据 using语法可以确保在使用完流后自动释放资源。
await using var stream = new MemoryStream();
//设置字体和大小
var font = SystemFonts.CreateFont("Arial", 50);
//定义水印的位置
var location = new PointF(image.Width - 250, image.Height - 100);
//添加水印
image.Mutate(ctx => ctx.DrawText("ZY blog", font, new Rgba32(255, 255, 255, 128), location));
//将修改后的图像保存到流中
await image.SaveAsync(stream, encoder);
//返回图片流
return new FileContentResult(stream.GetBuffer(), "image/jpeg");
}
方法二 使用图像叠加添加水印
有些图片在处理之前格式不支持透明度,所以有些图片无法加载有透明度的水印,那么可以使用图片叠加技术,在原有图像的基础上叠加一层水印图像,代码实现如下:
private static async Task<IActionResult> GenerateImageResponse(Image image, IImageFormat format)
{
var encoder = image.GetConfiguration().ImageFormatsManager.FindEncoder(format);
await using var stream = new MemoryStream();
// 创建水印图像
var watermarkImage = new Image<Rgba32>(image.Width, image.Height);
watermarkImage.Mutate(x => x.BackgroundColor(Rgba32.Transparent));
//参数与上面一致
var font = SystemFonts.CreateFont("Arial", 50, FontStyle.Bold);
var location = new PointF(watermarkImage.Width - 250, watermarkImage.Height - 100);
watermarkImage.Mutate(x => x.DrawText("ZY blog", font, new Rgba32(255, 255, 255, 128), location));
// 将水印图像与原始图像叠加
image.Mutate(x => x.DrawImage(watermarkImage, 1f));
image.Save(stream, encoder);
return new FileContentResult(stream.GetBuffer(), "image/jpeg");
}
该方法对比第一种方法多了一个水印图层,可能会导致一些性能损失,根据实际情况选择即可。
使用方法
前端调用写好的接口即可:
[HttpGet("Random/{width:int}/{height:int}")]
public async Task<IActionResult> GetRandomImage(int width,int height)
{
var (image,format) = await _service.GetRandomImageAsync(width,height);
return await GenerateImageResponse(image,format);
}
<img class="bd-placeholder-img" alt="" style="width:200px;height: 250px"
src="@Url.Action("GetRandomImage", "PicLib" ,new { seed = post.Id,Width = 800, Height = 1000})">
效果图

关键代码源码地址
personalblog/Personalblog/Apis/PicLibController.cs at master · ZyPLJ/personalblog · GitHub
参考资料
- Samples/ImageSharp/DrawWaterMarkOnImage at main · SixLabors/Samples · GitHub lmageSharp 官方实例
- 基于.NetCore开发博客项目 StarBlog - (15) 生成随机尺寸图片 - 程序设计实验室 - 博客园 (cnblogs.com)
.NET 个人博客-给图片添加水印的更多相关文章
- 使用GitHub-Pages创建博客和图片上传问题解决
title: 使用GitHub Pages创建博客和图片上传问题解决 date: 2017-10-22 20:44:11 tags: IT 技术 toc: true 搭建博客 博客的搭建过程完全参照小 ...
- WordPress免费清新响应式博客/杂志/图片三合一主题Nana
WordPress免费清新响应式博客/杂志/图片三合一主题Nana 一.主题安装须知 1.本主题必须安装文章点击统计插件:WP-PostViews,可以直接在后台插件→安装插件中直接搜索安装官方最新版 ...
- Hexo博客插入图片的方法
Hexo博客插入图片的方法 hexo图片blog hexo blog 插入图片的方法总结 hexo 的blog 内容是根据 markdown 文件的内容生成的html文件, 生成的文件全部在 /pub ...
- [技术博客]海报图片生成——小程序canvas画布
目录 背景介绍 canvas简介 代码实现 难点讲解 圆角矩形裁剪失败之PS的妙用 编码不要过硬 对过长的文字进行截取 真机首次生成时字体不对 drawImage只能使用本地图片 背景介绍 目标:利用 ...
- 使用Typora写博客,图片即时上传,无需第三方图床-EasyBlogImageForTypora
背景 习惯使用markdown的人应该都知道Typora这个神器,它非常简洁高效.虽然博客园的在线markdown编辑器也不错,但毕竟是网页版,每次写东西需要登录系统-进后台-找到文章-编辑-保存草稿 ...
- 使用Typora写博客,图片即时上传
背景 习惯使用markdown的人应该都知道Typora这个神器,它非常简洁高效.虽然博客园的在线markdown编辑器也不错,但毕竟是网页版,每次写东西需要登录系统-进后台-找到文章-编辑-保存草稿 ...
- 用IDM下载博客图片
前言 写博客的人一定都会有一个图床,将图片存在那里.发现自己以前没有注意图片来源问题,随手就贴在博客上面了.现在有不少图片都挂了,换句话来说有可能自己目前用的图床不提供服务了,那所有的图片都有可能丢失 ...
- Hexo 博客图片添加至图床---腾讯云COS图床使用。
个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 腾讯云官网 登录注册 创建存储桶 进入上面的存 ...
- 基于.NetCore开发博客项目 StarBlog - (20) 图片显示优化
前言 我的服务器带宽比较高,博客部署在上面访问的时候几乎没感觉有加载延迟,就没做图片这块的优化,不过最近有小伙伴说博客的图片加载比较慢,那就来把图片优化完善一下吧~ 目前有两个地方需要完善 图片瀑布流 ...
- 学习篇:TypeCodes的2015年博客升级记
原文: https://typecodes.com/mix/2015updateblog.html 2015年博客升级记 作者:vfhky | 时间:2015-05-23 17:25 | 分类:mix ...
随机推荐
- vue使用promise.all异步实现多个请求完成之后在执行某些操作
使用场景:多个请求方法拿到数据之后需要对这不同的数据进行比较,之后在输出并渲染 思路:使用promise.all()异步操作: Promise.all([ //上架 new Promise((reso ...
- B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能
B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能 @ 目录 B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa ...
- ORACLE查询表的DML最后时间和操作记录条数
ORACLE查询表的DML最后时间和操作记录条数 其中user代表当前用户的.dba代表的是有dba可以看到的相关表. select * from all_tab_modifications; sel ...
- Ubuntu安装完VMware tools还是不能和主机之间拖拽文件
Ubuntu安装完VMware tools还是不能和主机之间拖拽文件 1.确保已安装了VMware Tools 2.禁用 Wayland sudo gedit /etc/gdm3/custom.con ...
- 如何在Ubuntu 20.04上安装Pyenv 管理多版本Python
目录 ubuntu安装pyenv 管理多版本Python 参考文档: 安装pyenv: pyenv 命令列表 pycharm配置 ubuntu安装pyenv 管理多版本Python 参考文档: htt ...
- avue-crud字段之间的动态交互效果以及接口数据的获取赋值
一.form表单下拉表单类型字段数据获取 1.通过配置系统字典接口获取数据并渲染 { label: "经纪人", prop: "broker", type: & ...
- Linux:查看磁盘配额报告数据
近期在超算云上跑代码遇到了个乌龙,就是作业一提交到集群上去先是PD状态,然后马上就终止调了.后来知道是我用户目录下文件数量太多,导致已经超过管理员给我分配的磁盘配额了(众所周知机器学习相关项目的数据集 ...
- 大数据Hadoop集群的扩容及缩容(动态添加删除节点)
添加白名单和黑名单 白名单,表示在白名单的主机IP地址可以用来存储数据 企业中:配置白名单,可以尽量防止黑客恶意访问攻击. 配置白名单步骤如下:原文:sw-code 1)在NameNode节点的/op ...
- vue4 项目的创建
1,安装vue cli 脚手架,是全局安装npm install -g @vue/cli 可以在输出信息中看到安装位置,例如:C:\Users\xiaochangjian\AppData\Roamin ...
- 记一次U8的插件开发
在u8上开发一个winform的插件用来实现不同账套之间的单据协同,使用的方法是用存储过程走数据库.因为原账套的数据量会很大,如果直接在插件上用单线程传输,那肯定会造成传输过程,u8卡死的.一种方法是 ...