J'ai besoin que mon image à l'échelle soit aliasée en C#

c'est peut-être une question étrange, mais quand je mets à l'échelle mon image en C# j'ai besoin qu'elle soit pixelisée et non anti-aliasée. Tout comme dans MSpaint quand vous escaladez.

j'espère que les images anti-alias par défaut dans C#, ou bien j'ai changé quelque chose que je ne voulais pas.

j'ai essayé de jouer avec le Graphics.InterpolationMode mais pas de chance. J'utilise un objet Bitmap pour maintenir l'image et il est construit comme ceci:

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

Et une brève Synapse du contrôle personnalisé:

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);
    }

des idées? Grâce.

2
demandé sur Balk 2008-10-12 01:16:30

2 réponses

en fait, vous avez raison avec le mode interpolation, comme les docs disent . Il suffit de le régler à InterpolationMode.NearestNeighbor. Dans votre exemple de code, vous n'avez jamais défini m_interpolationMode.

3
répondu OregonGhost 2008-10-11 21:28:25

Eh bien, vous pourriez mettre en œuvre l'échelle vous-même et faire une interpolation linéaire simple (c.-à-d. ne faites pas de moyenne des voisins comme bicubic)... Ils ont l'air joli et blocky.

0
répondu dicroce 2008-10-11 21:19:28