Comment puis-je faire en sorte qu'une PictureBox utilise le rééchantillonnage du voisin le plus proche ?

StackOverflow https://stackoverflow.com/questions/29157

Question

J'utilise StretchImage car la boîte est redimensionnable avec des séparateurs.Il semble que la valeur par défaut soit une sorte de filtrage bilinéaire fluide, ce qui rend mon image floue et présente des motifs moirés.

Était-ce utile?

La solution

J'avais également besoin de cette fonctionnalité.J'ai créé une classe qui hérite de PictureBox, remplace OnPaint et ajoute une propriété pour permettre de définir le mode d'interpolation :

using System.Drawing.Drawing2D;
using System.Windows.Forms;

/// <summary>
/// Inherits from PictureBox; adds Interpolation Mode Setting
/// </summary>
public class PictureBoxWithInterpolationMode : PictureBox
{
    public InterpolationMode InterpolationMode { get; set; }

    protected override void OnPaint(PaintEventArgs paintEventArgs)
    {
        paintEventArgs.Graphics.InterpolationMode = InterpolationMode;
        base.OnPaint(paintEventArgs);
    }
}

Autres conseils

Je suppose que vous devrez effectuer le redimensionnement manuellement via la classe Image et la fonction DrawImage et répondre aux événements de redimensionnement sur PictureBox.

J'ai fait une recherche MSDN et il s'avère qu'il existe un article à ce sujet, qui n'est pas très détaillé mais souligne que vous devez utiliser l'événement paint.

http://msdn.microsoft.com/en-us/library/k0fsyd4e.aspx

J'ai édité un exemple de zoom d'image couramment disponible pour utiliser cette fonctionnalité, voir ci-dessous

Edité à partir de : http://www.dotnetcurry.com/ShowArticle.aspx?ID=196&AspxAutoDetectCookieSupport=1

J'espère que cela t'aides

    private void Form1_Load(object sender, EventArgs e)
    {
        // set image location
        imgOriginal = new Bitmap(Image.FromFile(@"C:\images\TestImage.bmp"));
        picBox.Image = imgOriginal;

        // set Picture Box Attributes
        picBox.SizeMode = PictureBoxSizeMode.StretchImage;

        // set Slider Attributes
        zoomSlider.Minimum = 1;
        zoomSlider.Maximum = 5;
        zoomSlider.SmallChange = 1;
        zoomSlider.LargeChange = 1;
        zoomSlider.UseWaitCursor = false;

        SetPictureBoxSize();

        // reduce flickering
        this.DoubleBuffered = true;
    }

    // picturebox size changed triggers paint event
    private void SetPictureBoxSize()
    {
        Size s = new Size(Convert.ToInt32(imgOriginal.Width * zoomSlider.Value), Convert.ToInt32(imgOriginal.Height * zoomSlider.Value));
        picBox.Size = s;
    }


    // looks for user trackbar changes
    private void trackBar1_Scroll(object sender, EventArgs e)
    {
        if (zoomSlider.Value > 0)
        {
            SetPictureBoxSize();
        }
    }

    // redraws image using nearest neighbour resampling
    private void picBox_Paint_1(object sender, PaintEventArgs e)
    {
        e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
        e.Graphics.DrawImage(
           imgOriginal,
            new Rectangle(0, 0, picBox.Width, picBox.Height),
            // destination rectangle 
            0,
            0,           // upper-left corner of source rectangle
            imgOriginal.Width,       // width of source rectangle
            imgOriginal.Height,      // height of source rectangle
            GraphicsUnit.Pixel);
    }

Lors du redimensionnement d'une image dans .net, System.Drawing.Drawing2D.InterpolationMode propose les méthodes de redimensionnement suivantes :

  • Bicubique
  • Bilinéaire
  • Haut
  • HauteQualitéBicubique
  • HauteQualitéBilinéaire
  • Faible
  • Voisin le plus proche
  • Défaut
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top