.NET Core c#使用SkiaSharp压缩裁切图片去除水印
2024-10-12
65
在.NET 6中,微软官方建议使用SkiaSharp库进行图片操作。本文主要介绍使用SkiaSharp库压缩裁切图片去除水印。
做图片压缩和去除水印,主要是为了在网站中使用图片。比如抓取某网站的文章和图片发布到自己的网站中。但是图片很大,而且还有水印就需要处理一下。
压缩图片的思路是缩放图片尺寸,适当降低图片质量。压缩效果可以参考这篇文章:。.NET Core c#使用SkiaSharp压缩图片
去除水印的话,很难从代码层面真实去除水印。一般水印在图片的边缘,上方或者下方,所以可以采取截掉部分高度来达到效果。
下面是实现的c#代码:
/// <summary>
/// 压缩并裁切图片去除上下水印
/// </summary>
/// <param name="source">原文件位置</param>
/// <param name="target">生成目标文件位置</param>
/// <param name="maxWidth">最大宽度,根据此宽度计算是否需要缩放,计算新高度</param>
/// <param name="top">顶部裁切高度,单位px</param>
/// <param name="bottom">底部裁切高度,单位px</param>
/// <param name="quality">图片质量,范围0-100</param>
public static void CompressAndCut(string source, string target, decimal maxWidth, int top, int bottom, 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 newWidth = width;
var newHeight = height;
if (width > maxWidth)
{
newWidth = maxWidth;
newHeight = height / width * maxWidth;
}
using (var resized = bitmap.Resize(new SKImageInfo((int)newWidth, (int)newHeight), SKFilterQuality.Medium))
{
if (resized != null)
{
using (var surface = SKSurface.Create(new SKImageInfo((int)newWidth, (int)newHeight - top - bottom))) {
var canvas = surface.Canvas;
canvas.DrawBitmap(resized, 0, 0 - top);
using (var image = surface.Snapshot()) {
using (var writeStream = File.OpenWrite(target)) {
image.Encode(SKEncodedImageFormat.Jpeg, quality).SaveTo(writeStream);
}
}
}
}
}
}
}
主要是把图片通过bitmap.Resize方法缩放大小,然后使用SKSurface对象的Create方法创建一个Canvas然后重新绘制图片后压缩保存。
接下来我们使用一张1000x704的jpg图片做测试,我故意在图片上下加了字作为水印。测试图片如下:
测试代码:
string source = "D:\\Images\\source.jpg";
//实验1 不改变尺寸,图片质量改为80,上下截去25px
ImageTools.CompressAndCut(source, "D:\\Images\\target-cut-1.jpg", 1000, 25, 25, 80);
//实验2 尺寸缩放到宽度800,图片质量改为80,上下截去25px
ImageTools.CompressAndCut(source, "D:\\Images\\target-cut-2.jpg", 800, 25, 25, 80);
测试结果:
可以看到图片分别被压缩到58KB和40KB,大小减少了一大半。
下面是两张实验图片,可以看到水印已经被截掉了。大家可以右键另存为后仔细对比一下,肉眼看不出区别。
实验1
实验2
更新于:1个月前赞一波!
相关文章
- Sylvan.Data.Excel 性能优异的开源.NET Excel数据读取库
- ASP.NET Core 中常用的内置中间件
- .NET9 F#有什么新特性?
- .NET 开源 ORM FreeSql 使用教程
- .NET9 C# 13 有哪些新特性?
- .NET9 开始删除内置的 Swagger 支持 可使用Scalar.AspNetCore替代
- .NET 9 中System.Text.Json 的新增功能
- 什么是.NET渐进式Web应用(PWA)
- .NET开发中常见的异常报错原因和解决方法?
- .NET框架和CLR的工作原理?
- ASP.NET MVC与Web Forms的区别
- C#中的String和StringBuilder的区别
- .NET C#中的IEnumerable和IEnumerator的区别
- 使用ADO.NET连接到南大通用GBase 8s数据库
- 鸿蒙OpenHarmony系统可以运行跨平台的.NET Core吗?
- ASP.NET Core使用partial标签报错
- .NET 9 即将推出的功能Task.WhenEach
- .NET 使用HttpClientFactory+Polly替代直接使用HttpClient
- C# Const 和 ReadOnly的区别
- .NET Framework被淘汰了吗?
文章评论
评论问答