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
中图:
小图:
压缩后的小图:
原图:
进一步检查图像后,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);
我正在尝试实现图像压缩功能,以用于上传到我网站的图像。我想拍摄原始图像并保存 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
中图:
小图:
压缩后的小图:
原图:
进一步检查图像后,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);