c# 如何图像质量压缩 减少文件体积大小

200
补充展位 Pages_Weblog_Get#0
文章摘要
此内容由人工摘要内容,并由AI根据文章内容进行润色
本文分享C#实现JSON文件默认打开程序的实用方法,适配服务器部署场景。可开发绿色版JSON编辑器放入程序发布目录,主程序以管理员权限启动后,通过注册表操作自动将JSON文件默认打开程序指定为自定义exe,无需手动设置,减少部署重复劳动,高效降低操作出错率,适配开发者部署需求。

c# 图像质量压缩 减少体积

数字图像信息作为最重要的信息之一,被愈来愈广泛的使用。日常开发页经常为了节约服务器磁盘或者传输效率 而需要在不影响人观感的情况下减小图像的体积 ,以下是一个c#图像压缩的方法

public static class CompressionImage  
{  
    /// <summary>  
    /// 图像压缩 /// </summary>  
    /// <param name="fileStream">图片流</param>  
    /// <param name="quality">压缩质量0-100之間 数值越大质量越高</param>  
    /// <returns></returns>  
    public static byte[] Execute(byte[] ImageBytes, long quality)  
    {  
        try  
        {  
            using (MemoryStream ms = new MemoryStream(ImageBytes))  
            {  
                ms.Position = 0;  
                using (System.Drawing.Image img = System.Drawing.Image.FromStream(ms))  
                {  
                    using (Bitmap bitmap = new Bitmap(img))  
                    {  
                        ImageCodecInfo CodecInfo = GetEncoder(img.RawFormat);  
                        System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;  
                        EncoderParameters myEncoderParameters = new EncoderParameters(1);  
                        EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, quality);  
                        myEncoderParameters.Param[0] = myEncoderParameter;  
                        using (MemoryStream ImageStream = new MemoryStream())  
                        {  
                            bitmap.Save(ImageStream, CodecInfo, myEncoderParameters);  
                            myEncoderParameters.Dispose();  
                            myEncoderParameter.Dispose();  
                            return ImageStream.ToArray();  
                        }  
                    }  
                }  
            }  
        }  
        catch { }  
        return ImageBytes;//转换出错返回原图像  
    }  
    public static byte[] ToBytes(this Stream fileStream)  
    {  
        byte[] buffer = new byte[fileStream.Length];  
        fileStream.Read(buffer, 0, buffer.Length);  
        return buffer;//转换出错返回原图像  
    }  
    private static ImageCodecInfo GetEncoder(ImageFormat format)  
    {  
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();  
        foreach (ImageCodecInfo codec in codecs)  
        {  
            if (codec.FormatID == format.Guid)  
            { return codec; }  
        }  
        return null;  
    }  

       //无损压缩
    public bool Execute2(string sFile, string dFile, ref string errMsg,int dHeight=0, int dWidth=0, int flag=60)
    {
       System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile);
       ImageFormat tFormat = iSource.RawFormat;
       int sW = 0, sH = 0;
       //按比例缩放
       Size tem_size = new Size(iSource.Width, iSource.Height);
       dHeight = dHeight == 0 ? tem_size.Height : dHeight;
       dWidth = dWidth == 0 ? tem_size.Width : dWidth;
       if (tem_size.Width > dHeight || tem_size.Width > dWidth) //将**改成c#中的或者操作符号
       {
           if ((tem_size.Width * dHeight) > (tem_size.Height * dWidth))
           {
               sW = dWidth;
               sH = (dWidth * tem_size.Height) / tem_size.Width;
           }
           else
           {
               sH = dHeight;
               sW = (tem_size.Width * dHeight) / tem_size.Height;
           }
       }
       else
       {
           sW = tem_size.Width;
           sH = tem_size.Height;
       }
       Bitmap ob = new Bitmap(dWidth, dHeight);
       Graphics g = Graphics.FromImage(ob);
       g.Clear(Color.WhiteSmoke);
       g.CompositingQuality = CompositingQuality.HighQuality;
       g.SmoothingMode = SmoothingMode.HighQuality;
       g.InterpolationMode = InterpolationMode.HighQualityBicubic;
       g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
       g.Dispose();
       //以下代码为保存图片时,设置压缩质量
       EncoderParameters ep = new EncoderParameters();
       long[] qy = new long[1];
       qy[0] = flag;//设置压缩的比例1-100
       EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
       ep.Param[0] = eParam;
       try
       {
            ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
            ImageCodecInfo jpegICIinfo = null;
            for (int x = 0; x < arrayICI.Length; x++)
            {
                if (arrayICI[x].FormatDescription.Equals("JPEG"))
                {
                    jpegICIinfo = arrayICI[x];
                    break;
                }
            }
          
            if (jpegICIinfo != null)
            {
                ob.Save(dFile, jpegICIinfo, ep);
            }
            else
            {
                ob.Save(dFile, tFormat);
            }
            return true;
        }
        catch(Exception ex)
        {
            //失败异常
            return false;
        }
        finally
        {
            iSource.Dispose();
            ob.Dispose();
        }
    }
}

quality 在80以上的 肉眼看着与原图相差不多,但体积可以减少很多

补充展位
Pages_Weblog_Get#c70e5065-be64-4933-9264-ffc9595f1ac8
补充展位 Pages_Weblog_Get#1
补充展位 Pages_Weblog_Get#2
专题推荐
暂无内容
补充展位 Pages_Weblog_Get#3