个人博客-给图片添加水印

前言

需要用到的库

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

参考资料

.NET 个人博客-给图片添加水印的更多相关文章

  1. 使用GitHub-Pages创建博客和图片上传问题解决

    title: 使用GitHub Pages创建博客和图片上传问题解决 date: 2017-10-22 20:44:11 tags: IT 技术 toc: true 搭建博客 博客的搭建过程完全参照小 ...

  2. WordPress免费清新响应式博客/杂志/图片三合一主题Nana

    WordPress免费清新响应式博客/杂志/图片三合一主题Nana 一.主题安装须知 1.本主题必须安装文章点击统计插件:WP-PostViews,可以直接在后台插件→安装插件中直接搜索安装官方最新版 ...

  3. Hexo博客插入图片的方法

    Hexo博客插入图片的方法 hexo图片blog hexo blog 插入图片的方法总结 hexo 的blog 内容是根据 markdown 文件的内容生成的html文件, 生成的文件全部在 /pub ...

  4. [技术博客]海报图片生成——小程序canvas画布

    目录 背景介绍 canvas简介 代码实现 难点讲解 圆角矩形裁剪失败之PS的妙用 编码不要过硬 对过长的文字进行截取 真机首次生成时字体不对 drawImage只能使用本地图片 背景介绍 目标:利用 ...

  5. 使用Typora写博客,图片即时上传,无需第三方图床-EasyBlogImageForTypora

    背景 习惯使用markdown的人应该都知道Typora这个神器,它非常简洁高效.虽然博客园的在线markdown编辑器也不错,但毕竟是网页版,每次写东西需要登录系统-进后台-找到文章-编辑-保存草稿 ...

  6. 使用Typora写博客,图片即时上传

    背景 习惯使用markdown的人应该都知道Typora这个神器,它非常简洁高效.虽然博客园的在线markdown编辑器也不错,但毕竟是网页版,每次写东西需要登录系统-进后台-找到文章-编辑-保存草稿 ...

  7. 用IDM下载博客图片

    前言 写博客的人一定都会有一个图床,将图片存在那里.发现自己以前没有注意图片来源问题,随手就贴在博客上面了.现在有不少图片都挂了,换句话来说有可能自己目前用的图床不提供服务了,那所有的图片都有可能丢失 ...

  8. Hexo 博客图片添加至图床---腾讯云COS图床使用。

    个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 腾讯云官网 登录注册 创建存储桶 进入上面的存 ...

  9. 基于.NetCore开发博客项目 StarBlog - (20) 图片显示优化

    前言 我的服务器带宽比较高,博客部署在上面访问的时候几乎没感觉有加载延迟,就没做图片这块的优化,不过最近有小伙伴说博客的图片加载比较慢,那就来把图片优化完善一下吧~ 目前有两个地方需要完善 图片瀑布流 ...

  10. 学习篇:TypeCodes的2015年博客升级记

    原文: https://typecodes.com/mix/2015updateblog.html 2015年博客升级记 作者:vfhky | 时间:2015-05-23 17:25 | 分类:mix ...

随机推荐

  1. C语言程序设计-笔记04-函数

    C语言程序设计-笔记04-函数 例5-1  计算圆柱体的体积.输入圆柱的高和半径,求圆柱体积volume=πxr^2xh.要求定义和调用函数cylinder(r,h)计算圆柱体的体积. #includ ...

  2. 一个支持Sora模型文本生成视频的Web客户端

    大家好,我是 Java陈序员. 最近 Open AI 又火了一把,其新推出的文本生成视频模型 -- Sora,引起了巨大的关注. Sora 目前仅仅只是发布预告视频,还未开放出具体的 API. 今天, ...

  3. C++ Grammar Focus

    一.结构体 1.基础模板 struct Node { <变量类型1> 变量名1; <变量类型2> 变量名2; ... } <定义变量名1>,<定义变量名2&g ...

  4. Spring6 当中的 Bean 循环依赖的详细处理方案+源码解析

    1. Spring6 当中的 Bean 循环依赖的详细处理方案+源码解析 @ 目录 1. Spring6 当中的 Bean 循环依赖的详细处理方案+源码解析 每博一文案 1.1 Bean的循环依赖 1 ...

  5. 01. go-admin的下载与启动

    目录 一.介绍 二.新建空文件夹 三.获取后台源码并启动 1.下载编译go代码 2.配置命令到goland IDE ,debug启动 四.获取前端ui源码并启动 1.下载编译go代码 2.启动项目 * ...

  6. MAPREDUCE实践篇

    1.编程规范 (1)用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端) (2)Mapper的输入数据是KV对的形式(KV的类型可自定义) (3)Mapp ...

  7. C#老码农的职业生涯

    开头白 大家好,我是tibos,19年10月1号由深圳回武汉的码农,目前入职武汉福禄网络,最近刷到的年终总结也比较多,赶在这最后一天,我也来凑个热闹 心路历程 -> 菜鸟入江湖 13年开启码农的 ...

  8. 性能优化陷阱之hash真的比strcmp快吗

    最近网上冲浪的时候看到有人分享了自己最近一次性能优化的经验.我向来对性能是比较敏感的,所以就点进去看了. 然而我越看越觉得蹊跷,但本着"性能问题和性能优化要靠性能测试做依据",我不 ...

  9. HTML——input之复选框

    在 HTML 中,把 <input> 标签中的 type 属性设置为 checkbox 可以实现多选框的效果.具体语法格式如下: <input type="checkbox ...

  10. exe应用程序安装为windows服务

    1.使用instsrv.exe和srvany.exe 当你获取到srvany后并决定将某程序作为服务启动后,请先将srvany安装为系统服务,具体的安装方法有很多,这里使用instsrv,语法如下:安 ...