这里有很多关于缩小图像大小的代码的帖子,但是对于所有这些帖子,我都遇到了这个人工制品问题,而在 Photoshop 中手动执行此操作时却没有遇到这种问题。
我还能做些什么来解决这个问题吗?我注意到,从 Photoshop 导出位图时,我可以使导出“渐进式”,是否有类似的东西可以在 C# 中有所帮助?
Photoshop 将 1080p 缩小为 480p:
从 SO 的大小调整为 1080p 到 480p:
图像的其余部分类似,但这里的衣领是我的代码收到的噪音的一个很好的例子。
我目前的功能:
public static Bitmap ResizeImage(Image image, int width, int height)
{
var destRect = new System.Drawing.Rectangle(0, 0, width, height);
var destImage = new System.Drawing.Bitmap(width, height);
destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);
using (var graphics = System.Drawing.Graphics.FromImage(destImage))
{
graphics.CompositingMode = CompositingMode.SourceCopy;
graphics.CompositingQuality = CompositingQuality.HighQuality;
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
using (var wrapMode = new System.Drawing.Imaging.ImageAttributes())
{
wrapMode.SetWrapMode(WrapMode.TileFlipXY);
graphics.DrawImage(image, destRect, 0, 0, image.Width, image.Height, System.Drawing.GraphicsUnit.Pixel, wrapMode);
}
}
return destImage;
}
第二张图片看起来有相当严重的jpeg 伪影。这通常可以从高对比度边缘附近的大量噪声中明显看出。
Photoshop 可能还使用更高级的缩小滤镜,但其效果应该只影响边缘或其他高频特征,并且差异应该比示例图像中的大量噪点微妙得多。
请参阅如何设置 jpeg 压缩级别,以控制保存图像时应用的压缩量,从而控制噪声量:
var jpgEncoder = GetEncoder(ImageFormat.Jpeg);
var myEncoderParameters = new EncoderParameters(1);
myEncoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 95L);
myBitmap.Save(myFilePath, jpgEncoder, myEncoderParameters);
请注意,不同的 jpeg 编码器库可能会产生略有不同的结果。内置编码器应该“足够好”,但有第三方库声称质量/文件大小稍好。另请注意,jpeg 格式本身确实很旧,因此,如果您更关心质量/大小而不是兼容性,那么肯定有更好的格式可供选择。