我正在尝试实现图像压缩功能,用于上传到我网站的图像。我想拍摄原始图像并保存3种不同尺寸/质量等级。为此我使用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上分享的已上传原始图片
媒体图片:
小图片:
压缩的小图片:
原始图片:
答案 0 :(得分:4)
在进一步检查图像后,EXIF数据确实 该文件的问题。它包含一个带有自定义颜色配置文件的部分,并且其中存储的数据大小约为2.64兆字节。这可以通过将图像上传到http://regex.info/exif.cgi并单击“显示ICC配置文件数据”来检查。
剥离奇怪的配置文件数据可以消除极端开销,并将文件大小降低到348 KB,速度为1000x1000像素。
正如您已经发现的那样,您必须将preserveExifData
对象的构造函数中的ImageFactory
参数设置为false
,以使其删除数据。或者将默认构造函数称为
ImageFactory imageFactory = new ImageFactory();
答案 1 :(得分:0)
使用ImageProcessor时,可以在processing.config中设置一个选项
<processing preserveExifMetaData="true" fixGamma="false" interceptAllRequests="false" allowCacheBuster="true">
设置preserveExifMetaData="false"
以删除EXIF数据。
您还可以在ImageFactory构造函数中设置选项:
var imageFactory = new ImageFactory(preserveExifData:true);