.net5 generates picture thumbnails, can set the quality of generated pictures, reduce the number of bytes

Need to install the package System.Drawing.Common in nuget


        /// <summary>
        /// 生成缩略图,不包括.gif
        /// </summary>
        /// <param name="dWidth">要生成的宽度</param>
        /// <param name="dHeight">要生成的高度</param>
        /// <param name="flag">生成图片质量,1-100,高质量为100</param>
        /// <param name="inFile">输入文件路径</param>
        /// <param name="dFile">生成的缩略图保存路径</param>
        public static void CompressImg(int dWidth, int dHeight, string inFile, string dFile, int flag = 80)
        {
    
    
            System.Drawing.Image iSource = System.Drawing.Image.FromFile(inFile);
            System.Drawing.Imaging.ImageFormat tFormat = iSource.RawFormat;
            //按比例缩放  
            if (iSource.Width > dWidth)
            {
    
    
                dHeight = dWidth * iSource.Height / iSource.Width;
            }
            else
            {
    
    
                dWidth = iSource.Width;
                dHeight = iSource.Height;
            }
            Bitmap ob = new Bitmap(dWidth, dHeight);
            //ob.SetResolution(72,72);
            Graphics g = Graphics.FromImage(ob);
            //清空画布并以透明背景色填充
            g.Clear(System.Drawing.Color.Transparent);
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.DrawImage(iSource, new Rectangle(0, 0, dWidth, dHeight), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
            g.Dispose();
            //以下代码为保存图片时,设置压缩质量  
            System.Drawing.Imaging.EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters();
            long[] qy = new long[1];
            qy[0] = flag;//设置压缩的比例1-100  
            System.Drawing.Imaging.EncoderParameter eParam = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
            ep.Param[0] = eParam;
            try
            {
    
    
                System.Drawing.Imaging.ImageCodecInfo[] arrayICI = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
                System.Drawing.Imaging.ImageCodecInfo jpegICIinfo = null;
                string imgExtend = tFormat.ToString().ToUpper();
                for (int x = 0; x < arrayICI.Length; x++)
                {
    
    
                    if (arrayICI[x].FormatDescription.Equals(imgExtend))
                    {
    
    
                        jpegICIinfo = arrayICI[x];
                        break;
                    }
                }
                if (jpegICIinfo != null)
                {
    
    
                    ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径  
                }
                else
                {
    
    
                    ob.Save(dFile, tFormat);
                }
            }
            catch (Exception ex)
            {
    
    
                string msg = ex.Message;
                Console.WriteLine(msg);
            }
            finally
            {
    
    
                iSource.Dispose();
                ob.Dispose();
            }
        }

        /// <summary>
        /// 生成缩略图,图片流输入,输出图片流
        /// </summary>
        /// <param name="dWidth">要生成的宽度</param>
        /// <param name="dHeight">要生成的高度</param>
        /// <param name="flag">生成图片质量,1-100</param>
        /// <param name="inputStream">输入图片流</param>
        /// <param name="outStream">输出图片流</param>
        public static void CompressImgByte(int dWidth, int dHeight, Stream inputStream, Stream outStream, int flag = 80)
        {
    
    
            System.Drawing.Image iSource = System.Drawing.Image.FromStream(inputStream);
            System.Drawing.Imaging.ImageFormat tFormat = iSource.RawFormat;
            //按比例缩放
            if (iSource.Width > dWidth)
            {
    
    
                dHeight = dWidth * iSource.Height / iSource.Width;
            }
            else
            {
    
    
                dWidth = iSource.Width;
                dHeight = iSource.Height;
            }
            Bitmap ob = new Bitmap(dWidth, dHeight);
            //ob.SetResolution(72,72);
            Graphics g = Graphics.FromImage(ob);
            //清空画布并以透明背景色填充
            g.Clear(System.Drawing.Color.Transparent);
            g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.DrawImage(iSource, new Rectangle(0, 0, dWidth, dHeight), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
            g.Dispose();
            //以下代码为保存图片时,设置压缩质量  
            System.Drawing.Imaging.EncoderParameters ep = new System.Drawing.Imaging.EncoderParameters();
            long[] qy = new long[1];
            qy[0] = flag;//设置压缩的比例1-100  
            System.Drawing.Imaging.EncoderParameter eParam = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
            ep.Param[0] = eParam;
            try
            {
    
    
                System.Drawing.Imaging.ImageCodecInfo[] arrayICI = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
                System.Drawing.Imaging.ImageCodecInfo jpegICIinfo = null;
                string imgExtend = tFormat.ToString().ToUpper();
                for (int x = 0; x < arrayICI.Length; x++)
                {
    
    
                    if (arrayICI[x].FormatDescription.Equals(imgExtend))
                    {
    
    
                        jpegICIinfo = arrayICI[x];
                        break;
                    }
                }
                if (jpegICIinfo != null)
                {
    
    
                    ob.Save(outStream, jpegICIinfo, ep);//dFile是压缩后的新路径  
                }
                else
                {
    
    
                    ob.Save(outStream, tFormat);
                }
            }
            catch (Exception ex)
            {
    
    
                string msg = ex.Message;
                Console.WriteLine(msg);
            }
            finally
            {
    
    
                iSource.Dispose();
                ob.Dispose();
            }
        }

Guess you like

Origin blog.csdn.net/u011511086/article/details/113735758