开发者

C#针对System.Drawing.Bitmap压缩的实现

目录
  • 一、使用Image.Save方法并设置压缩参数(推荐)
    • 将 Bitmap 保存为 JPEG 并设置压缩质量
    • 使用示例:
  • 二、调整图像尺寸进行“体积”压缩
    • 三、将压缩后的 Bitmap 转为字节数组(用于网络传输等)
      • 注意事项:
    • 替代方案:使用 ImageSharp(跨平台推荐)

      在 C# 中,System.Drawing.Bitmap 是表示图像的核心类之一。如果想要对 Bitmap 对象进行压缩,通常是指将其保存为文件时使用较低的图像质量(例如 JPEG 格式),或者调整其尺寸以减少内存占用或文件大小。

      一、使用Image.Save方法并设置压缩参数(推荐)

      将 Bitmap 保存为 JPEG 并设置压缩质量

      using System;
      using System.Drawing;
      using System.Drawing.Imaging;
      
      public class ImageCompressor
      {
          public static void CompressAndSave(Bitmap bitmap, string outputPath, long quality = 80L)
          {
              // 指定编码器为 JPEG
              ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
      
              // 设置压缩质量
              En编程coder qualityEncoder = Encoder.Quality;
              EncoderParameters encoderParams = new EncoderParameters(1);
              EncoderParameter qualityParam = new EncoderParameter(qualityEncoder, quality); // 0-100
              encoderParams.Param[0] = qualityParam;
      
              // 保存图像
              bitmap.Save(outputPath, jpgEncoder, encoderParams);
          }
      
          private static ImageCodecInfo GetEncoder(ImageFormat format)
          {
              ImageCodecInfo[] codecsphp = ImageCodecInfo.GetImageDecoders();
              foreach (ImageCodecInfo codec in codecs)
              {
                  if (codec.FormatID == format.Guid)
                  {
                      return codec;
                  }
              }
              return null;
          }
      }

      使用示例:

      Bitmap bmp = new Bitmap("input.png");
      ImageCompressor.CompressAndSave(bmp, "output.jpg", 70L); // 压缩质量设为70%
      bmp.Dispose();

      二、调整图像尺寸进行“体积”压缩

      如果希望进一步减小图像大小,可以先调整图像的宽高,然后可以结合上面的方法,把缩小后的图像再进行压缩保存:

      public static Bitmap ResizeBitmap(Bitmap original, int newWidth, int newHeight)
      {
          Bitmap resized = new Bitmap(newWidth, newHeight);
          using (Graphics g = Graphics.FromImage(resized))
          {
              g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
              g.DrawImage(original, 0, 0, newWidth, newHeight);
          }
          return resized;
      }

      三、将压缩后的 Bitmap 转为字节数组(用于网络传输等)

      public static byte[] CompressBitmapToBytes(Bitmap bitmap, long quality = 80L)
      {
          using (var mphps = new MemoryStream())
          {
              ImageCodecInfo jpgEncoder = GetEncoder(ImageFormat.Jpeg);
              Encoder qualityEncoder = Encoder.Quality;
              EncoderParameters encoderParams = new EncoderParameters(1);
              encoderParams.Param[0] = new EncoderParameter(qualityEncoder, quality);
      
              bitmap.Save(ms, jpgEncoder, encoderParams);
              return ms.ToArray();
          }
      }

      注意事项:

      1. 格式支持:只有某些图像格式(如 JPEG)支持质量压缩,PNG 是无损压缩格式,不支持。
      2. 资源释放:记得调用 .Dispose() 来释放 Bitmap 和 Graphics 等资源。
      3. 性能优化:频繁操作图像时建议使用 unsafe 或 LockBits 提高性能,但复杂度会增加。
      4. 跨平台兼容性System.Drawing.Common 在 .NET Core/.NET 5+ 中不再支持非 Windows 平台。如果需要跨平台编程,请考虑使用 ImageSharp。

      替代方案:使用 ImageSharp(跨平台推荐)

      using SixLabors.ImageSharp;
      using SixLabors.ImageSharp.Processing;
      using SixLabors.ImageSharp.Formats.Jpeg;
      
      var image = Image.Load("input.png");
      image.Mutate(x => x.Resize(ijavascriptmage.Width / 2, image.Height / 2)); // 缩放
      image.SaveAsJpeg("output.jpg", new JpegEncoder { Quality = 70 }); // 压缩质量

      到此这篇关于C#针对System.Drawing.Bitmap压缩的实现的文章就介绍到这了,更多相关C# System.Drawing.Bitmap压缩内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜