zoukankan      html  css  js  c++  java
  • C# 大图片压缩算法,减少图片体积

    声明:

    图片压缩算法,不建议对小图片进行压缩,一般文件小于1m的,真心没必要压缩,

    图片很小的,例如:几百KB的图片,有可能不会减少图片体积,反而压缩后更大,也很正常,

    请大家合理使用,并不是,所有图片,越压缩越好!!!!!

    上面是我对2M多的图片进行了测试,压缩质量设置了50,压缩到了800KB,放大和缩小和原图,几乎没有什么区别。


    代码如下:

    private void button3_Click(object sender, EventArgs e)
            {
                using (OpenFileDialog ofd = new OpenFileDialog())
                {
                    ofd.Filter = "图片|*.jpg;*.png;*.gif;*.jpeg;*.bmp";
                    if (ofd.ShowDialog() == DialogResult.OK)
                    {
                        using (FileStream file = new FileStream(ofd.FileName, FileMode.Open))
                        {
                            var img = CompressionImage(file, 50L);
                            MessageBox.Show(CreateImageFromBytes(AppDomain.CurrentDomain.BaseDirectory + @"" + Guid.NewGuid().ToString(), img));
                        }
    
                    }
                }
            }
    
            /// <summary>
            /// Convert Byte[] to Image
            /// </summary>
            /// <param name="buffer"></param>
            /// <returns></returns>
            public static Image BytesToImage(byte[] buffer)
            {
                MemoryStream ms = new MemoryStream(buffer);
                Image image = System.Drawing.Image.FromStream(ms);
                return image;
            }
    
            /// <summary>
            /// Convert Byte[] to a picture and Store it in file
            /// </summary>
            /// <param name="fileName"></param>
            /// <param name="buffer"></param>
            /// <returns></returns>
            public static string CreateImageFromBytes(string fileName, byte[] buffer)
            {
                string file = fileName;
                Image image = BytesToImage(buffer);
                ImageFormat format = image.RawFormat;
                if (format.Equals(ImageFormat.Jpeg))
                {
                    file += ".jpeg";
                }
                else if (format.Equals(ImageFormat.Png))
                {
                    file += ".png";
                }
                else if (format.Equals(ImageFormat.Bmp))
                {
                    file += ".bmp";
                }
                else if (format.Equals(ImageFormat.Gif))
                {
                    file += ".gif";
                }
                else if (format.Equals(ImageFormat.Icon))
                {
                    file += ".icon";
                }
                System.IO.FileInfo info = new System.IO.FileInfo(file);
                System.IO.Directory.CreateDirectory(info.Directory.FullName);
                File.WriteAllBytes(file, buffer);
                return file;
            }
            /// <summary>
            /// 壓縮圖片 /// </summary>
            /// <param name="fileStream">圖片流</param>
            /// <param name="quality">壓縮質量0-100之間 數值越大質量越高</param>
            /// <returns></returns>
            private byte[] CompressionImage(Stream fileStream, long quality)
            {
                using (System.Drawing.Image img = System.Drawing.Image.FromStream(fileStream))
                {
                    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 ms = new MemoryStream())
                        {
                            bitmap.Save(ms, CodecInfo, myEncoderParameters);
                            myEncoderParameters.Dispose();
                            myEncoderParameter.Dispose();
                            return ms.ToArray();
                        }
                    }
                }
            }
    
            private static ImageCodecInfo GetEncoder(ImageFormat format)
            {
                ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
                foreach (ImageCodecInfo codec in codecs)
                {
                    if (codec.FormatID == format.Guid)
                    { return codec; }
                }
                return null;
            }  
  • 相关阅读:
    List of the best open source software applications
    Owin对Asp.net Web的扩展
    NSwag给api加上说明
    'workspace' in VS Code
    unable to find valid certification path to requested target
    JMeter的下载以及安装使用
    exception disappear when forgot to await an async method
    Filter execute order in asp.net web api
    记录web api的request以及response(即写log)
    asp.net web api的源码
  • 原文地址:https://www.cnblogs.com/testsec/p/6095939.html
Copyright © 2011-2022 走看看