GDI +调整像素缩放的大小

时间:2009-03-29 04:20:54

标签: gdi+ resize pixel

我想用GDI库调整图像的大小,这样当我调整它的大小比以前更大时,没有混合。 (就像放大绘画程序中的图像一样)

EG:如果我的图像是2px宽,2px高 (白色,白色,
白色,黑色)
,我把它调整为100%大,它是4px乘4px高 (白色,白色,白色,白色,
白色,白色,白色,白色,
白色,白色,黑色,黑色,
白色,白色,黑色,黑色)

我可以使用什么InterpolationMode或Smoothing模式(或其他属性)来实现此目的?到目前为止我尝试过的组合都会导致灰色出现在测试图像中。

以下是我正在使用的代码

    /// <summary>
    /// Do the resize using GDI+
    /// Credit to the original author
    /// http://www.bryanrobson.net/dnn/Code/Imageresizing/tabid/69/Default.aspx
    /// </summary>
    /// <param name="srcBitmap">The source bitmap to be resized</param>
    /// <param name="width">The target width</param>
    /// <param name="height">The target height</param>
    /// <param name="isHighQuality">Shoule the resize be done at high quality?</param>
    /// <returns>The resized Bitmap</returns>

    public static Bitmap Resize(Bitmap srcBitmap, int width, int height, bool isHighQuality)
    {
        // Create the destination Bitmap, and set its resolution
        Bitmap destBitmap = new Bitmap((int)Convert.ToInt32(width), (int)Convert.ToInt32(height), PixelFormat.Format24bppRgb);
        destBitmap.SetResolution(srcBitmap.HorizontalResolution, srcBitmap.VerticalResolution);

        // Create a Graphics object from the destination Bitmap, and set the quality
        Graphics grPhoto = Graphics.FromImage(destBitmap);
        if (isHighQuality)
        {
            grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
        }
        else
        {
            grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; //? this doesn't work
            grPhoto.InterpolationMode = InterpolationMode.NearestNeighbor; //? this doesn't work


        }
        // Do the resize
        grPhoto.DrawImage(srcBitmap,
              new Rectangle(0, 0, width, height),
              new Rectangle(0, 0, srcBitmap.Width, srcBitmap.Height),
              GraphicsUnit.Pixel);

        grPhoto.Dispose();
        return destBitmap;
    }

3 个答案:

答案 0 :(得分:3)

使用InterpolationMode.NearestNeighbor,你在正确的轨道上。但是,使用默认的PixelOffsetMode,GDI +将尝试在像素边缘处进行采样,从而导致混合。

要在没有混合的情况下进行缩放,您还需要使用PixelOffsetMode.Half。将您的非高质量案例更改为:

else
{
    grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    grPhoto.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
}

答案 1 :(得分:0)

在绘制图像并传入源矩形时,仅传入原始图像的放大部分并将其绘制到较大的区域。当用户放大时,在某些时候他们将无法在查看区域中看到整个图像。因此,找出哪些源区域仍应在视图中并仅绘制该区域。

答案 2 :(得分:0)

看起来你没有对我做错任何事。请参阅Microsoft关于InterpolationMode的说明:

http://msdn.microsoft.com/en-us/library/ms533836(VS.85).aspx

也许这个功能完美无缺,但你给它错误的参数或错误地显示结果?