ImageProcessor.ImageFactory 压缩不会减小图像文件的大小

ImageProcessor.ImageFactory compression not reducing image file size

我正在尝试实现图像压缩功能,以用于上传到我网站的图像。我想拍摄原始图像并保存 3 个不同的 sizes/quality 级别。为此,我使用 ImageProcessor.ImageFactory。三个级别:

ISupportedImageFormat sm_format = new JpegFormat { Quality = 40 };
Size sm_size = new Size(150, 0);

ISupportedImageFormat md_format = new JpegFormat { Quality = 60 };
Size md_size = new Size(280, 0);

ISupportedImageFormat lg_format = new JpegFormat { Quality = 100 };
Size lg_size = new Size(1000, 0);

imageFactory.Load(or_directoryPath + "/" + fileName)
            .Resize(sm_size)
            .Format(sm_format)
            .BackgroundColor(Color.Transparent)
            .Save(Path.Combine(sm_directory, fileName));
// same for md and lg images

发生的情况是中小图像没有预期的较小文件大小。

一个例子: 原始图像是 .jpg 3000x3000,大小为 3.7MB。

大图大小为2.96MB 中等图像大小为 2.63MB 小图大小为2.62MB

我在小图片上尝试了以下操作以将其进一步压缩到 10% 质量:

// Encoder parameter for image quality 
EncoderParameter qualityParam = new EncoderParameter(Encoder.Quality, 10);
// JPEG image codec 
ImageCodecInfo jpegCodec = GetEncoderInfo("image/jpeg");
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = qualityParam;
img.Save(path, jpegCodec, encoderParams);

最终结果质量明显降低,但图像文件大小仍为 2.62MB

编辑:上传原图分享到postimg

中图:

Yellow-116-Ravenna-7-Back-View.jpg

小图:

Yellow-116-Ravenna-7-Back-View.jpg

压缩后的小图:

Yellow-116-Ravenna-7-Back-View.jpg

原图:

Yellow-116-Ravenna-7-Back-View.jpg

进一步检查图像后,EXIF 数据确实该文件的问题。它包含一个带有自定义颜色配置文件的部分,并在其中存储了大小约为 2.64 兆字节的数据。这可以通过将图像上传到 http://regex.info/exif.cgi 并单击 "Show ICC profile data".

来检查

剥离奇怪的配置文件数据可以消除极大的开销,并将文件大小减小到 1000x1000 像素时的 348 KB。

正如您自己发现的那样,您必须将 ImageFactory 对象的构造函数中的 preserveExifData 参数设置为 false 以使其剥离数据。或者将默认构造函数调用为

ImageFactory imageFactory = new ImageFactory();

当使用 ImageProcessor 时,可以在 processing.config

中设置一个选项
<processing preserveExifMetaData="true" fixGamma="false" interceptAllRequests="false" allowCacheBuster="true">

设置 preserveExifMetaData="false" 也删除 EXIF 数据。

您还可以在 ImageFactory 构造函数中设置选项:

var imageFactory = new ImageFactory(preserveExifData:true);