雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

.NET Core c#使用SkiaSharp压缩图片

2024-10-12 25

在.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

更新于:6天前
赞一波!

文章评论

评论问答