Question

C’est peut-être une question étrange, mais lorsque j’échelle mon image en C #, j’ai besoin qu’elle soit pixélisée et non anti-aliasée. Comme dans MSpaint lorsque vous redimensionnez.

J'espère que les images sont anti-alias par défaut en C #, sinon j'ai changé quelque chose que je ne voulais pas.

J'ai essayé de jouer avec le Graphics.InterpolationMode mais sans succès. J'utilise un objet Bitmap pour contenir l'image et elle est construite comme suit:

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

Et une brève synthèse 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? Merci.

Était-ce utile?

La solution

En fait, vous avez raison avec InterpolationMode, en tant que la documentation indique . Il suffit de le définir sur InterpolationMode.NearestNeighbor. Dans votre exemple de code, vous ne définissez jamais m_interpolationMode.

Autres conseils

Eh bien, vous pouvez implémenter la balance vous-même et faire une interpolation linéaire simple (par exemple, ne faites pas de moyenne de voisin comme une bicubique) ... Celles-ci ont l’air sympa et blocées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top