1、首先命令行安装插件
Install-Package SkiaSharp
2、基于图片质量的压缩
/// <summary>
/// 压缩图片
/// </summary>
/// <param name="source"> 原文件位置 </param>
/// <param name="target"> 生成目标文件位置</param>
/// <param name="scale"> 图片缩放比例:大于1放大;小于1,[0-1]缩小</param>
/// <param name="quality">图片质量,范围0-100</param>
public static void Compress(string source, string target, decimal scale, int quality)
{
using (var file = File.OpenRead(source))
using (var fileStream = new SKManagedStream(file))
using (var bitmap = SKBitmap.Decode(fileStream))
{
var width = (decimal)bitmap.Width;
var height = (decimal)bitmap.Height;
var maxWidth = bitmap.Width*scale;
var newWidth = maxWidth;
var newHeight = height / width * maxWidth;
using (var resized = bitmap.Resize(new SKImageInfo((int) newWidth, (int) newHeight), SKFilterQuality.Medium))
{
using (var image = SKImage.FromBitmap(resized))
using (var writeStream = File.OpenWrite(target))
{
image.Encode(GetFormat(target), quality).SaveTo(writeStream);
}
}
}
}
其中,GetFormat 方法:
private static SKEncodedImageFormat GetFormat(string file)
{
var ext= Path.GetExtension(file).TrimStart('.').ToLower();
SKEncodedImageFormat format= SKEncodedImageFormat.Png;
switch (ext)
{
case "jpg":
case "jpeg":
format = SKEncodedImageFormat.Jpeg;
break;
case "png":
format = SKEncodedImageFormat.Png;
break;
case "gif":
format = SKEncodedImageFormat.Gif;
break;
case "webp":
format = SKEncodedImageFormat.Webp;
break;
case "wbmp":
format = SKEncodedImageFormat.Wbmp;
break;
case "bmp":
format = SKEncodedImageFormat.Bmp;
break;
case "astc":
format = SKEncodedImageFormat.Astc;
break;
case "dng":
format = SKEncodedImageFormat.Dng;
break;
default:
format = SKEncodedImageFormat.Avif;
break;
}
return format;
}
3、图片加水印
可以先定义一组描述添加水印行为的类
public record Margin(int t, int l, int r, int b);
public record MarkerFont(string font, float size, SKColor color,bool fw=true);
public record WaterMarker(string txt, MarkerFont font, Margin m);
然后将通过参数传递,添加水印
public static void AddWaterMarkers(string source, string target, List<WaterMarker> markers, int quality = 100)
{
using (var file = File.OpenRead(path: source))
using (var fileStream = new SKManagedStream(file))
using (var bitmap = SKBitmap.Decode(fileStream))
{
var width = (decimal)bitmap.Width;
var height = (decimal)bitmap.Height;
//加水印:
if (markers != null)
{
using (var canvas = new SKCanvas(bitmap))
using (SKPaint sKPaint = new SKPaint())
{
foreach (var marker in markers)
{
sKPaint.Color = marker.font.color;//字体颜色
sKPaint.TextSize = marker.font.size;//字体大小
sKPaint.FakeBoldText = true;
sKPaint.IsAntialias = true;//开启抗锯齿
sKPaint.Typeface = SkiaSharp.SKTypeface.FromFamilyName(marker.font.font ?? "微软雅黑");//字体
SKRect size = new SKRect();
sKPaint.MeasureText(marker.txt, ref size);//计算文字宽度以及高度
float x=0,y=0;
if (marker.m.b > 0)
{
y = (float) (height - marker.m.b - (decimal) size.Height);
}
else
{
y = marker.m.t;
}
if (marker.m.r > 0)
{
x = (float) (width - marker.m.r - (decimal) size.Width);
}
else
{
x = marker.m.l;
}
canvas.DrawText(marker.txt, x, y, sKPaint);//画文字
}
}
}
using (var writeStream = File.OpenWrite(target))
{
bitmap.Encode(GetFormat(target), quality).SaveTo(writeStream);
}
}
}