在 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();
}
}注意事项:
- 格式支持:只有某些图像格式(如 jpeg)支持质量压缩,png 是无损压缩格式,不支持。
- 资源释放:记得调用
.dispose()来释放bitmap和graphics等资源。 - 性能优化:频繁操作图像时建议使用
unsafe或lockbits提高性能,但复杂度会增加。 - 跨平台兼容性:
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压缩内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论