当前位置: 代码网 > it编程>编程语言>Asp.net > C#针对System.Drawing.Bitmap压缩的实现

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

2025年07月04日 Asp.net 我要评论
在 c# 中,system.drawing.bitmap 是表示图像的核心类之一。如果想要对 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压缩内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com