我需要我的缩放图像在C#中别名

时间:2008-10-11 21:16:30

标签: c# image bitmap

这可能是一个奇怪的问题,但是当我在C#中缩放图像时,我需要将其设置为像素化而不是消除锯齿。就像在缩放时的MSpaint一样。

我希望C#中默认使用图像反别名,否则我会改变我不想要的内容。

我试过玩Graphics.InterpolationMode,但没有运气。我正在使用Bitmap对象来保存图像,它的构造如下:

// A custom control holds the image
this.m_ZoomPanPicBox.Image = new Bitmap(szImagePath);

自定义控件的简短说明:

class ZoomPanPicBox : ScrollableControl
{
    Image m_image;
    float m_zoom = 1.0f;
    InterpolationMode m_interpolationMode;
    ...
    ////////////////////////////////////////////////////////
    public ZoomPanPicBox()
    {
        //Double buffer the control
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);

        this.AutoScroll=true;
    }
    ////////////////////////////////////////////////////////
    protected override void OnPaint(PaintEventArgs e)
    {
        //if no image, don't bother
        if(m_image==null)
        {
            base.OnPaintBackground(e);
            return;
        }

        //Set up a zoom matrix
        Matrix mx = new Matrix(m_zoom,0,0,m_zoom,0,0);

        //now translate the matrix into position for the scrollbars
        mx.Translate(this.AutoScrollPosition.X / m_zoom, this.AutoScrollPosition.Y / m_zoom);

        //use the transform
        e.Graphics.Transform = mx;

        //and the desired interpolation mode
        e.Graphics.InterpolationMode = m_interpolationMode;

        //Draw the image ignoring the images resolution settings.
        e.Graphics.DrawImage(m_image,new Rectangle(0,0,this.m_image.Width,this.m_image.Height),0,0,m_image.Width, m_image.Height,GraphicsUnit.Pixel);

        base.OnPaint(e);
    }

有什么想法吗?感谢。

2 个答案:

答案 0 :(得分:3)

实际上,你使用InterpolationMode是正确的the docs say。只需将其设置为InterpolationMode.NearestNeighbor。在您的代码示例中,您永远不会设置m_interpolationMode。

答案 1 :(得分:0)

嗯,你可以自己实现比例并做一个简单的线性插值(I.E.不做任何像bicubic这样的邻居平均)......那些看起来不错且块状。