我试图减少使用SixLabors ImageSharp生成的图片缩略图(100x75PX)的大小,使用JpegEncoder。然而,尽管使用了质量级别,但是图像在文件大小上似乎并没有太大的变化。
在我的遗留System.Drawing代码中,当我使用ImageCodecInfo编码器和设置为30的Imaging.Encoder.Quality的EncoderParameter时,我会收到很好的低质量图像--大约2k。完美的缩略图。
对于SixLabors.ImageSharp.Formats.Jpeg.JpegEncoder.Quality,无论我将ImageSharp设置为什么,图像总是24k左右。质量可以设置为0-100,可见质量下降,但文件大小不太下降-即使jpegs是滑稽压缩。总是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);
...Seems就像MS文档所说的一样--提取的缩略图与缩放源图像不同:
如果图像包含嵌入的缩略图,则此方法检索嵌入的缩略图并将其缩放到所请求的大小。如果图像不包含嵌入的缩略图,则此方法通过缩放主图像创建缩略图。
(我是.NET 6 tho的新手,所以不确定什么是“平台扩展”,以及这在.NET核心库中是否有效。看起来它们可能是"Windows兼容性包“NuGet包的一部分,但只适用于Windows部署。因为我是在Mac上部署的,所以这个System.Drawing.GetThumbnailImage可能不能工作--因此可以使用ImageSharp。)
编辑: ImageSharp代码正在缩放来自源的新图像,它似乎保留了EXIF数据。我的遗留代码拇指(从源代码中提取)不包含EXIF数据。这可能是浮肿的根源。特别是如果EXIF数据本身有缩略图的话。
在保存新的缩放缩略图之前,我将尝试找到一个方法或库来清除EXIF,并查看它是否更小。
谢谢!
发布于 2022-02-12 22:51:41
是XMP元数据。调整源图像到缩略图的大小可维护它们的元集合。您必须在保存之前将其移除。或者,使用该方法从元数据中提取实际缩略图,而不是创建新的缩略图。
有关EXIF移走的有关问题:
How do I clear an Image's EXIF data with ImageSharp?
有关提取缩略图的相关问题:
https://stackoverflow.com/questions/71094812
复制相似问题