• C# 压缩图片


    .net下跨平台图像处理

    https://github.com/mono/SkiaSharp

    安装包

    skiasharp
    在这里插入图片描述

    效果

    在这里插入图片描述

    代码

    ImageCompression.cs

    using SkiaSharp;
    
    namespace ImageCompressStu01
    {
        /// 
        /// 图片压缩
        /// 
        public class ImageCompression
        {
            /// 
            /// 压缩图片
            /// 
            /// 原文件位置
            /// 生成目标文件位置
            /// 最大宽度,根据此宽度计算是否需要缩放,计算新高度
            /// 图片质量,范围0-100
            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);
                            }
                        }
                    }
                }
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    Program.cs

    namespace ImageCompressStu01
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                string source = "001.jpg";
                //实验1 不改变尺寸,图片质量改为80,存为jpg图片
                ImageCompression.Compress(source, "target-1.jpg", 1920, 80);
                //实验2 不改变尺寸,图片质量改为80,存为png图片
                ImageCompression.Compress(source, "target-2.png", 1920, 80);
                //实验3 尺寸缩放到宽度800,图片质量改为80,存为jpg图片
                ImageCompression.Compress(source, "target-3.jpg", 800, 80);
                //实验4 尺寸缩放到宽度800,图片质量改为60,存为jpg图片
                ImageCompression.Compress(source, "target-4.jpg", 800, 60);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    这个是针对桌面或者控制台项目,web项目处理方式可以参考下面的方法

    /// 
    /// 压缩图片
    /// 
    /// IFormFile转化为stream
    /// 最大宽度,根据此宽度计算是否需要缩放,计算新高度
    /// 图片质量,范围0-100
    public static byte[]? Compress(Stream file, decimal maxWidth, int quality)
    {
        byte[]? result = null;
        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))
                    {
                        result = image.Encode(SKEncodedImageFormat.Jpeg, quality).ToArray();
                    }
                }
            }
        }
        return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    IFormfile转stream方法如下

    //内存流
    var memory = new MemoryStream();
    await formFile.CopyToAsync(memory);
    //一定要重置一下,要不然执行压缩会报错
    stream.Seek(0, SeekOrigin.Begin);
    //文件流
    var filePath = "xxxxx.txt";
    using (var stream = System.IO.File.Create(filePath))
    {
        await formFile.CopyToAsync(stream);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    参考1
    参考2

    扩展

    生成海报的开源库,可以跨平台使用
    https://github.com/SixLabors/ImageSharp

  • 相关阅读:
    内网穿透工具 Cpolar 帮您实现用友U8 Cloud 的外网部署,一键畅享云端ERP
    用于准确量化颅面对称性和面部生长的 3D 头影测量方案(Matlab代码实现)
    多功能音频工具的旗舰音乐编辑工具!Music Studio
    es查询初学
    20年的 .NET ,更需要 00 后的你
    投稿期刊被on hold了是怎么回事?SCI期刊状态解读(超全整理,一文解惑)
    最新WooCommerce教程指南-如何搭建B2C外贸独立站
    Java String、StringBuffer和StringBuilder的相关总结
    ArcGIS Pro 3.0最新消息
    vCenter学习笔记
  • 原文地址:https://blog.csdn.net/qq_36437991/article/details/134032549