.NET Core c#使用SkiaSharp压缩图片
2024-10-12
67
在.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
更新于:1个月前赞一波!1
相关文章
- .NET 游戏开发框架有哪些?
- PluginCore 基于 ASP.NET Core 的轻量级插件框架
- .NET C# EntityFramework(EF)连接SQLite代码示例
- 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
文章评论
评论问答