|
|

声明:
图片压缩算法,不建议对小图片进行压缩,一般文件小于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;
- }
复制代码
|
上一篇:急求C语言潮流计算程序下一篇:文件大小Bytes到KB,MB,GB,TB单位智能转换
|