.NET Core c#使用SkiaSharp压缩图片
2024-10-12
50
在.NET 6中,微软不建议使用System.Drawing.Common。因为System.Drawing.Common被设计为Window 技术的精简包装器,因此其跨平台实现欠佳。官方建议使用SkiaSharp库进行图片操作。
.NET 6 c#使用SkiaSharp压缩图片是比较方便的。压缩图片有两个思路:
按比例修改图片尺寸。如果图片本身很大,而且图片是用来放在网站上的,那么可以等比例缩放图片减少图片的大小,加快图片加载速度。
修改图片质量。可以稍微降低图片质量达到压缩图片的效果。
首先需要安装SkiaSharp包,可以通过nuget安装:
下面使用SkiaSharp压缩图片的c#代码:
using SkiaSharp;
namespace Tools
{
public static class ImageTools
{
/// <summary>
/// 压缩图片
/// </summary>
/// <param name="source">原文件位置</param>
/// <param name="target">生成目标文件位置</param>
/// <param name="maxWidth">最大宽度,根据此宽度计算是否需要缩放,计算新高度</param>
/// <param name="quality">图片质量,范围0-100</param>
public static void Compress(string source, string target, decimal maxWidth, 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 image = SKImage.FromBitmap(resized))
using (var writeStream = File.OpenWrite(target))
{
image.Encode(SKEncodedImageFormat.Jpeg, quality).SaveTo(writeStream);
}
}
}
}
}
}
}
主要用到了SkiaSharp里的SKBitmap对象的Resize方法缩放了图片,然后调整质量重新保存。
下面用一张大小为1740KB的PNG屏幕截图文件来做测试。图片原来的尺寸是1920x1080。调用测试代码如下:
string source = "D:\\Images\\source.png";
//实验1 不改变尺寸,图片质量改为80,存为jpg图片
ImageTools.Compress(source, "D:\\Images\\target-1.jpg", 1920, 80);
//实验2 不改变尺寸,图片质量改为80,存为png图片
ImageTools.Compress(source, "D:\\Images\\target-2.png", 1920, 80);
//实验3 尺寸缩放到宽度800,图片质量改为80,存为jpg图片
ImageTools.Compress(source, "D:\\Images\\target-3.jpg", 800, 80);
//实验4 尺寸缩放到宽度800,图片质量改为60,存为jpg图片
ImageTools.Compress(source, "D:\\Images\\target-4.jpg", 800, 60);
实验结果:
可以看到,原图大小为1740KB,在尺寸不变的情况下,压缩后仅为155KB,如果尺寸缩小到800px的话,文件大小仅为42KB和29KB。
下面是压缩后的图片,可以右键保存后比较图片质量清晰度。肉眼看不出有什么区别。
实验1
实验2
实验3
实验4
更新于:24天前赞一波!
相关文章
- 使用ADO.NET连接到南大通用GBase 8s数据库
- 鸿蒙OpenHarmony系统可以运行跨平台的.NET Core吗?
- ASP.NET Core使用partial标签报错
- .NET 9 即将推出的功能Task.WhenEach
- .NET 使用HttpClientFactory+Polly替代直接使用HttpClient
- C# Const 和 ReadOnly的区别
- .NET Framework被淘汰了吗?
- 强大的 .NET Mock 框架 单元测试模拟库Moq使用教程
- Asp.Net Core进程内托管 和 进程外托管的区别
- C# 使用Barrier进行多线程同步
- 什么是.NET云原生应用程序?
- ASP.NET Core实现多语言本地化Web应用程序
- PDFiumCore | .NET Core PDF 处理渲染库
- C#发送邮件代码简洁示例(附源码下载)
- .NET Blazor 2024年发展趋势
- 解决.NET JAVA PHP中写入及读取memcache中数据不一致的方法
- .NET调试Windows服务的方法
- C# Word转换成Pdf的方法
- c#使用MongoDB开发LBS应用
- hprose for C#使用教程
文章评论
评论问答