发布时间:2019-08-29责任编辑:满帅 浏览:7090
环境简介
系统环境
Windows10 1903
.NetCore SDK 版本
.NetCore 2.2
ImageSharp 版本
SixLabors.ImageSharp 1.0.0-beta0006
1.安装ImageSharp Nuget 包
目前为止,ImageSharp还没有一个正式的发布版本,所以这里使用的是预览版本。
如果通过Visual Studio 安装Nuget 包,记得勾选包含预发行版本。如果不知道ImageSharp 是什么,去github 看一下。
通过CLR 安装ImageSharp
dotnet add '项目名称' package SixLabors.ImageSharp --version 1.0.0-beta0006
2. 编写添加水印的代码
public Stream Watermark(Stream origin, Stream mark, string position, float scale, float opacity)
{
// TODO: 参数校验
// origin mark 不可空,
// position 可指定默认值
// scale opacity 不可小于等于0
using(var originImage = Image.Load(origin))
{
using(var markImage = Image.Load(mark))
{
// 设置水印的大小,如果图片宽大于高, scale缩放的是水印图的宽度,否则将应用到高度上
float markWidth = originImage.Width * scale;
if (originImage.Width < originImage.Height)
markWidth = originImage.Height * scale;
// 对水印图片进行等比缩放
float ratio = markWidth / markImage.Width;
float markHeight = markImage.Height * ratio;
markImage.Mutate(mk =>
mk.Resize((int)markWidth, (int)markHeight)
);
// 根据position 计算水印位置
// position可能的值如下 "left top botom center right"
// 这些值可以进行组合 如果同一方向有重复值,后面的会覆盖掉前面的
// 按照 中左上右下的顺序处理
position = position.ToLower();
Point point = new Point();
if (position.Contains("center"))
{
point.X = (originImage.Width - markImage.Width) / 2;
point.Y = (originImage.Height - markImage.Height) / 2;
}
if (position.Contains("left"))
point.X = 0;
if (position.Contains("top"))
point.Y = 0;
if (position.Contains("right"))
point.X = originImage.Width - markImage.Width;
if (position.Contains("bottom"))
point.Y = originImage.Height - markImage.Height;
// 把水印加到图片上
originImage.Mutate(oi =>
{
oi.DrawImage(markImage, point, opacity);
});
origin.Position = 0;
var format = Image.DetectFormat(origin);
var encoder = Configuration.Default.ImageFormatsManager.FindEncoder(format);
var outStream = new MemoryStream();
originImage.Save(outStream, encoder);
origin.Position = 0;
mark.Position = 0;
outStream.Position = 0;
return outStream;
}
}
}
最后
ImageSharp 的使用起来很简单方便,有关更多使用ImageSharp的细节,可以参考ImageSharp 的文档
注:此方法在咔咔文件服务器的图片处理模块使用
外包组供稿