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

C# WinForms中PictureBox设置StretchImage后右下方出现白边如何解决

问题根因

该白边由GDI+默认的图像渲染逻辑导致:拉伸图像时默认从像素中心开始计算坐标,加上插值模式的边缘半透明混合,最终在控件边缘出现溢出的浅色/白色边,和原始图像无关。

最简解决方案(二选一即可)

方案1:修改PictureBox渲染逻辑(无额外预处理,适合动态更新截图的场景)

  • 先将PictureBox的SizeMode属性改为Normal,禁用默认拉伸逻辑
  • 为PictureBox添加Paint事件,代码如下:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    if (pictureBox1.Image == null) return;
    // 取色场景推荐用邻近插值,完全保留原始像素色值
    e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
    // 修正像素偏移,从像素左上角开始渲染,避免边缘溢出
    e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
    // 手动拉伸绘制图像,填满整个控件区域
    e.Graphics.DrawImage(pictureBox1.Image, 
        new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height), 
        new Rectangle(0, 0, pictureBox1.Image.Width, pictureBox1.Image.Height), 
        GraphicsUnit.Pixel);
}

方案2:预拉伸图像再赋值(适合截图固定不变的场景)

如果不需要频繁更新截图内容,可以提前把原始小尺寸截图拉伸到控件尺寸再赋值,无需修改控件事件:

// originalBmp为你截取的10x10原始图像
Bitmap originalBmp = [你的原始截图对象];
Bitmap stretchedBmp = new Bitmap(80, 80);
using (Graphics g = Graphics.FromImage(stretchedBmp))
{
    g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
    g.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
    g.DrawImage(originalBmp, 0, 0, 80, 80);
}
// 赋值给PictureBox,SizeMode设为Normal即可
pictureBox1.Image = stretchedBmp;

补充说明

你之前检索到的GetSize()相关方法是旧讨论中自定义计算拉伸尺寸的冗余逻辑,上述两种方案已经覆盖需求,无需额外实现该方法。


内容的提问来源于stack exchange,提问作者Taki7o7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:45:03