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

前言

需要用到的库

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. 16.prometheus监控总结

    一.监控流程总结 1.需要在被监控的服务器上安装xx_exporter来收集数据(可以是源码安装,最好用docker.docker-compose) 2.添加Prometheus配置,去收集(xx_e ...

  2. vue-cli快速搭建项目的几个文件(三)

    ==========有加载动画的app.vue=========== <template>   <div id="app">     <keep-al ...

  3. 一文搞懂Maven配置,从此不再糊涂下载依赖(文末有成品)

    一般来说Maven都是配合着idea一起使用,下载依赖速度慢就去网上找个镜像配置一下,但总会遇到莫名其妙的问题,比如镜像源不生效.Error reading file pom.xml等等.今天详细讲解 ...

  4. 通俗易懂的KMP理论讲解(含手求Next数组)

    通俗易懂的KMP理论讲解(含手求Next数组) 1.KMP算法介绍 KMP算法的核心是利用匹配失败后的信息,通过一个 next 数组,保存模式串中前后最长公共子序列的长度,尽量减少模式串与主串的匹配次 ...

  5. 06. rails gem 安装mysql

    修改Gamefile Gamefile 里添加 gem 'mysql2' 执行命令行 bundle 可以看到下图片上已经安装好依赖了 修改配置文件 修改config/database.yml文件 # ...

  6. 02 redis 三种特殊的数据类型

    目录 一. 地理空间(geospatial) 索引半径查询 二.Hyperloglog 三. Bitmaps 课程学习地址: https://www.bilibili.com/video/BV1S54 ...

  7. Selenium4自动化测试2--元素定位By.ID,By.CLASS_NAME,By.TAG_NAME

    三.元素定位方式 1-通过id定位,By.ID id属性在HTML中是唯一的,因此使用id定位可以确保找到页面上唯一的元素. 由于id是唯一的,浏览器在查找元素时可以快速定位到目标元素,提高了定位的效 ...

  8. Java 工程文件的 .gitignore

    以下是一个排查 Java 工程文件的 .gitignore 文件示例: # Java 编译器生成的文件 *.class # Maven 生成的文件夹 target/ # Eclipse 生成的文件夹 ...

  9. 前端使用 Konva 实现可视化设计器(10)- 对齐线

    请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee源码 示例地址 不知不觉来到第 10 章了,感觉接近尾声了... 对齐线 ...

  10. 网络安全—IPSec安全策略

    文章目录 网络拓扑 添加策略 ESP 添加筛选器 添加筛选器的操作 另一台主机设置 AH 使用Windows Server 2003系统 网络拓扑 client1 IP = 192.168.17.10 ...