项目背景
最近好友有咨询如何在C#下压缩JPG图像的问题。若允许更改JPG图像的质量就可以压缩图像在本地磁盘上的体积。遇到这种需求,很多同学会想到使用OpenCV、Imagick等第三方库。其实不用加入这些第三方库就可以实现需求,这样软件打包后体积更小,迁移也更容易。
在此分享一下如何使用纯C#代码,不依赖第三方库如何实现。
基本效果如下
这是原始图片,大小为163KB
这是不更改图像尺寸,仅修改图像质量的图片,大小97KB。直接看上去,肉眼比较难分辨图像质量变化。
基本思路
JPG图像在使用时本身有图像质量这个属性,需要在保存时,对这个属性进行操作,就可以实现图像的压缩。
主要模块——获取JPG图像的属性
本模块主要获取了JPG图像的属性信息,返回的是一个ImageCodecInfo值。
代码如下:
static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
写入质量参数
获取到图像的EncoderParameter后,就可以对质量这个属性进行操作了。
注意:encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 50L);
中50L是long类型,切勿用错
实现代码如下:
using (Image image = Image.FromFile(@".\test.jpg"))
{
ImageCodecInfo jpegCodec = GetEncoder(ImageFormat.Jpeg);
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 50L);
image.Save("output.jpg", jpegCodec, encoderParams);
Console.WriteLine("done.");
Console.ReadLine();
}
不足和改进
JPG在进行压缩时,会降低图像质量,而且有的时候质量下降会被肉眼所辨识出来,这也是这种方法本身的不足。
其实压缩图片的体积,不仅可以使用JPG方式降低图像质量,还可以将图像更改为Webp格式,这样图像质量损失更小,而且体积也能降下来,有兴趣的话可以借助Imagick等第三方库实现转化。