首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么尽管设置了ImageSharp JpegEncoder.Quality,文件大小仍然是静态的?

为什么尽管设置了ImageSharp JpegEncoder.Quality,文件大小仍然是静态的?
EN

Stack Overflow用户
提问于 2022-02-12 18:41:29
回答 1查看 467关注 0票数 1

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

在我的遗留System.Drawing代码中,当我使用ImageCodecInfo编码器和设置为30的Imaging.Encoder.QualityEncoderParameter时,我会收到很好的低质量图像--大约2k。完美的缩略图。

对于SixLabors.ImageSharp.Formats.Jpeg.JpegEncoder.Quality,无论我将ImageSharp设置为什么,图像总是24k左右。质量可以设置为0-100,可见质量下降,但文件大小不太下降-即使jpegs是滑稽压缩。总是24k左右。

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

代码语言:javascript
运行
复制
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,保存了它。这些拇指一开始可能很小。听起来这与从源图像缩放新缩略图不同吗?遗留代码:

代码语言:javascript
运行
复制
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);

...Seems就像MS文档所说的一样--提取的缩略图与缩放源图像不同:

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

如果图像包含嵌入的缩略图,则此方法检索嵌入的缩略图并将其缩放到所请求的大小。如果图像不包含嵌入的缩略图,则此方法通过缩放主图像创建缩略图。

(我是.NET 6 tho的新手,所以不确定什么是“平台扩展”,以及这在.NET核心库中是否有效。看起来它们可能是"Windows兼容性包“NuGet包的一部分,但只适用于Windows部署。因为我是在Mac上部署的,所以这个System.Drawing.GetThumbnailImage可能不能工作--因此可以使用ImageSharp。)

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

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-12 22:51:41

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

有关EXIF移走的有关问题:

How do I clear an Image's EXIF data with ImageSharp?

有关提取缩略图的相关问题:

How do I extract a jpeg's EXIF thumbnail using ImageSharp?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71094812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档