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

 更新时间:2025年07月04日 11:11:55   作者:wangnaisheng  
C#中System.Drawing.Bitmap压缩可通过调整尺寸和JPEG质量实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 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);

        // 设置压缩质量
        Encoder 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[] codecs = 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 ms = 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(image.Width / 2, image.Height / 2)); // 缩放
image.SaveAsJpeg("output.jpg", new JpegEncoder { Quality = 70 }); // 压缩质量

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

相关文章

  • 详解C#中通过委托来实现回调函数功能的方法

    详解C#中通过委托来实现回调函数功能的方法

    这篇文章主要介绍了C#中通过委托来实现回调函数功能的方法,文中举了一个典型的多线程回调程序实例,需要的朋友可以参考下
    2016-04-04
  • C# 最齐全的上传图片方法

    C# 最齐全的上传图片方法

    本文主要介绍了C# 最齐全的上传图片方法,方法里包括了图片大小限制、图片尺寸、文件内容等等的判断。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • WPF中NameScope的查找规则详解

    WPF中NameScope的查找规则详解

    这篇文章主要给大家介绍了关于WPF中NameScope的查找规则的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • 一文看懂C#中List的扩容机制

    一文看懂C#中List的扩容机制

    这篇文章主要介绍了C#中的扩容机制,文中以实例代码辅助,帮助大家更好的工作和学习,感兴趣的小伙伴不妨了解下
    2020-05-05
  • 实例分享C#中Explicit和Implicit用法

    实例分享C#中Explicit和Implicit用法

    本篇文章主要给读者们分享了C#中Explicit和Implicit的用法,对此有需求和兴趣的朋友们一起学习下吧。
    2017-12-12
  • C#使用csvhelper实现csv的基本操作

    C#使用csvhelper实现csv的基本操作

    CsvHelper 是一个用于读写 CSV 文件的.NET库,极其快速,灵活且易于使用,CsvHelper 建立在.NET Standard 2.0 之上,几乎可以在任何地方运行,本文给大家介绍了C#使用csvhelper实现csv的基本操作,需要的朋友可以参考下
    2024-07-07
  • 深入讲解C#编程中嵌套类型和匿名类型的定义与使用

    深入讲解C#编程中嵌套类型和匿名类型的定义与使用

    这篇文章主要介绍了C#编程中嵌套类型和匿名类型的定义与使用,包括在SQL语句中使用匿名类型的方法,需要的朋友可以参考下
    2016-01-01
  • C#实现在匿名方法中捕获外部变量的方法

    C#实现在匿名方法中捕获外部变量的方法

    这篇文章主要介绍了C#实现在匿名方法中捕获外部变量的方法,本文直接给出代码实例,然后分析了代码中的一些知识点,需要的朋友可以参考下
    2015-03-03
  • C#如何将查询到的数据库里面的数据输出到textbox控件

    C#如何将查询到的数据库里面的数据输出到textbox控件

    这篇文章主要介绍了C#如何将查询到的数据库里面的数据输出到textbox控件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • C#实现自动生成电子印章

    C#实现自动生成电子印章

    网络办公正逐渐成为常态,无纸化办公也是一个潮流。本文将利用C#语言实现自动生成电子印章功能,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-08-08

最新评论