• 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;
            }  
  • 相关阅读:
    编译Android源码
    Android Studio 更新
    ANDROID:替换系统桌面
    Linux目录树与文件系统
    主引导记录MBR
    Android开发使用run-as获取应用数据
    桥接模式
    工厂方法模式
    Floyd's Cycle Detection Algorithm
    用两个stack实现一个队列
  • 原文地址:https://www.cnblogs.com/testsec/p/6095939.html
Copyright © 2020-2023  润新知