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

时间:2016-12-09 11:38:54

标签: c# image jpeg image-compression

我正在尝试实现图像压缩功能,用于上传到我网站的图像。我想拍摄原始图像并保存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上分享的已上传原始图片

媒体图片:

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

2 个答案:

答案 0 :(得分:4)

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

enter image description here

剥离奇怪的配置文件数据可以消除极端开销,并将文件大小降低到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);