.NET Core c#使用SkiaSharp压缩裁切图片去除水印
2024-10-12
149
在.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
更新于:3个月前赞一波!2
相关文章
- .NET C# 使用Hook钩子实现全局监听键盘和鼠标
- BotSharp 基于 .NET 平台的开源 AI 聊天机器人框架
- .NET C#连接FTP实现文件上传下载
- C#使用 Attribute 实现 AOP 功能
- ABP.Net Core使用教程(一)启动模版项目
- C#中的线程安全的集合ConcurrentQueue使用示例
- .NET C#中的Func、Predicate和Expression用法详解
- 5个高性能 .NET Core 图片处理库推荐
- ASP.NET如何将Views文件夹从项目分离
- C#13新特性 使用System.Threading.Lock简化线程同步
- .NET C# 读取编辑.AVIF图片文件
- .NET C# SkiaSharp读取.AVIF图片文件报错
- .NET开源ORM FreeSql常见问题和解决方法
- 微软于发布了.NET 9 Release Candidate 2 提高整体质量
- 分享5个开源的.NET Excel读写操作库
- .Net Core中Dapper的使用详解
- ASP.NET 使用Entity Framework (EF) 创建迁移修改SQLite数据库表结构
- 如何从.NET Framework迁移到.NET Core或.NET 6/7?
- 如何优化ASP.NET Core应用的性能?
- 10款.NET开发中推荐的代码分析和质量工具
文章评论
评论问答