You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 22:06:04