C#中Graphics.DrawImage默认缩放算法及自定义调整咨询
问题解答
你给出的代码如下:
var target = new Bitmap(source.Size.Width / 2, source.Size.Height / 2); using (var g = Graphics.FromImage(target)) { g.DrawImage(source, new Rectangle(Point.Empty, target.Size)); g.Save(); return target; }
1. 默认缩放方法说明
你当前未手动指定渲染参数时,Graphics实例默认使用 双线性插值(Bilinear Interpolation) 作为缩放算法:
- 既不是简单对4个像素取算术平均值,也不是直接取源图像对应区域{0,0}位置的像素值
- 双线性插值会对目标像素对应源图像区域周围的2x2个像素做加权平均计算,权重和像素距离相关,最终得到的缩放结果边缘比最近邻算法更平滑
2. 调整缩放行为的方法
你可以通过修改Graphics对象的相关属性自定义缩放逻辑,常见可调整参数如下:
- 调整
InterpolationMode属性切换插值算法,可选值包括:InterpolationMode.NearestNeighbor:最近邻插值,就是你提到的直接取对应区域最近像素值的模式,性能最高但缩放后会有明显锯齿InterpolationMode.Bilinear:默认的双线性插值InterpolationMode.Bicubic:双三次插值,比双线性平滑度更高,适合照片类图像缩小InterpolationMode.HighQualityBicubic:高质量双三次插值,是GDI+提供的质量最高的缩小算法之一
- 可以搭配
PixelOffsetMode.Half调整像素偏移,避免缩小图像时出现边缘偏移问题
修改后的示例代码:
var target = new Bitmap(source.Size.Width / 2, source.Size.Height / 2); using (var g = Graphics.FromImage(target)) { // 自定义插值模式为高质量双三次 g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; // 调整像素偏移避免边缘错位 g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; g.DrawImage(source, new Rectangle(Point.Empty, target.Size)); g.Save(); return target; }
注意:代码中的
g.Save()方法保存的是Graphics对象的状态栈(比如当前的裁剪、变换参数),并不是把图像内容写入磁盘,如果你需要保存图像到文件,需要调用target.Save(文件路径)方法。
内容的提问来源于stack exchange,提问作者Ian Newson
相关产品推荐
相关产品推荐

