在WinForms上绘制的已调整大小的图像似乎具有“模糊”边缘

时间:2014-02-11 21:52:23

标签: c# winforms image resize paint

我的图像在磁盘上保存为64x64的大小。我使用以下代码加载图像:

resizeImage(Image.FromFile(@"C:\Users\ApachePilotMPE\Desktop\" + "img.png"), new Size(128, 128))

返回一个像这样的图像转换的位图:

public static Image resizeImage(Image i, Size newSize)
{
    return (Image)(new Bitmap(i, newSize));
}

当我在图像上绘制图像时,图像中对象的两侧(只有黑色和白色棒图,具有透明背景)看起来好像已被抗锯齿以与背景混合。有没有办法防止这种情况发生?我尝试在运行时将Graphics.SmoothingMode设置为None,但这似乎没有任何效果。

enter image description here

上图:装入尺寸为64并增加到128时的彩绘图像。

左下:在128处加载时绘制的图像。

右下角:Edited-In Image,使用Paint.NET调整大小,大小为128。

要指定:顶部图像应该看起来像左下角。

修改

检查帖子顶部的更新代码。

1 个答案:

答案 0 :(得分:1)

  return (Image)(new Bitmap(i, newSize));

您正在让Bitmap构造函数调整图像大小。它会选择一个好的"插值模式,试图避免像素大四倍的块状外观。然而,您更喜欢块状外观,这意味着您必须自己控制插值模式。像这样:

    public static Image ResizeImage(Image img, Size size) {
        var bmp = new Bitmap(size.Width, size.Height);
        using (var gr = Graphics.FromImage(bmp)) {
            gr.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
            gr.DrawImage(img, new Rectangle(Point.Empty, size));
        }
        return bmp;
    }

另请注意,您可能更喜欢插入gr.Clear(Color.White)时获得的外观;在该代码内部而不是更改InterpolationMode。这避免了原始图像中具有笨拙RGB值的透明像素的问题。