为什么尽管有 ImageSharp JpegEncoder.Quality 设置,文件大小仍保持不变?

Why does file size remain static despite ImageSharp JpegEncoder.Quality setting?

我正在尝试使用 JpegEncoder 减小使用 SixLabors ImageSharp 生成的照片缩略图 (100x75 像素) 的大小。然而,尽管使用了质量级别,但图像的文件大小似乎没有太大变化。

在我的遗留 System.Drawing 代码中,当我使用 ImageCodecInfo 编码器和 EncoderParameter 对于 Imaging.Encoder.Quality 设置为 30,我会收到不错的低质量图像 — 大约 2k。非常适合缩略图。

使用 ImageSharp,无论我将 SixLabors.ImageSharp.Formats.Jpeg.JpegEncoder.Quality 设置为什么,图像始终约为 24k。质量可以设置为 0-100,可见质量会下降,但文件大小不会下降太多——即使 jpeg 被压缩得很滑稽。总是大约 24k.

谁能解释这是为什么?为什么 .Quality 5 的图像被写入到与 90 大致相同的大小,尽管有显着的可见压缩?我需要使用此编码器设置其他属性吗?我应该使用不同的格式以获得更好的结果吗?

image.Mutate(x => x.Resize(width, height));
        
SixLabors.ImageSharp.Formats.Jpeg.JpegEncoder encoder = new SixLabors.ImageSharp.Formats.Jpeg.JpegEncoder();
        
encoder.Quality = 30; //0-100. 30 was my System.Drawing code.
                            
image.Save(thumbnailPath, encoder);

编辑:我的遗留代码可能通过 System.Drawing.GetThumbnailImage 从源图像中“提取”了缩略图,然后将其保存。这些拇指一开始可能很小。听起来这与从源图像缩放新缩略图不同?遗留代码:

Image theThumb = theImage.GetThumbnailImage(width, height, myCallback, IntPtr.Zero);

//set up parameter for compression quality
EncoderParameters encoderParameters = new EncoderParameters(1);
encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 30);

//codec to use
ImageCodecInfo encoder = ImageCodecInfo.GetImageEncoders()[1]; //"image/jpeg"

theThumb.Save(thumbnailPath, encoder, encoderParameters);

...似乎 MS 文档说的是相同的——提取的缩略图与缩放源图像不同:

https://docs.microsoft.com/en-us/dotnet/api/system.drawing.image.getthumbnailimage?view=dotnet-plat-ext-6.0

If the Image contains an embedded thumbnail image, this method retrieves the embedded thumbnail and scales it to the requested size. If the Image does not contain an embedded thumbnail image, this method creates a thumbnail image by scaling the main image.

(我是 .NET 6 的新手,所以不确定什么是“平台扩展”,也不确定这是否适用于 .NET Core 库。看起来它们可能是“Windows 兼容包”NuGet 包,但仅用于 Windows 部署。由于我在 Mac 上部署,因此 System.Drawing.GetThumbnailImage 可能无法工作——因此与 ImageSharp 一起工作。)

编辑:ImageSharp 代码正在缩放来自源的新图像,它似乎保留了 EXIF 数据。我的旧代码缩略图(从源代码中提取)不包含 EXIF 数据。这可能是膨胀的根源。特别是如果 EXIF 数据本身有缩略图

我会尝试在保存新的缩放缩略图之前找到一种方法或库来清除 EXIF,看看它是否更小。

谢谢!

这是 XMP 元数据。将源图像缩小为缩略图可维护其元集合。您必须在保存之前将其删除。或者,使用该方法从元数据中提取实际缩略图,而不是创建新的缩略图。

EXIF 删除的相关问题:

提取缩略图的相关问题: