Comment faire en sorte qu’un PictureBox utilise le rééchantillonnage du plus proche voisin?

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 lisse, ce qui rend l’image floue et les motifs moirés.

J’avais besoin de cette fonctionnalité aussi. J’ai créé une classe qui hérite de PictureBox, substitue OnPaint et ajoute une propriété permettant au mode d’interpolation d’être défini:

 using System.Drawing.Drawing2D; using System.Windows.Forms; ///  /// Inherits from PictureBox; adds Interpolation Mode Setting ///  public class PictureBoxWithInterpolationMode : PictureBox { public InterpolationMode InterpolationMode { get; set; } protected override void OnPaint(PaintEventArgs paintEventArgs) { paintEventArgs.Graphics.InterpolationMode = InterpolationMode; base.OnPaint(paintEventArgs); } } 

Je suppose que vous allez devoir redimensionner manuellement via la classe Image et la fonction DrawImage et réagir aux événements de redimensionnement de la 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 indique que vous devez utiliser l’événement paint.

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

J’ai modifié un exemple de zoom d’image couramment disponible pour utiliser cette fonctionnalité (voir ci-dessous).

Édité à 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 Atsortingbutes picBox.SizeMode = PictureBoxSizeMode.StretchImage; // set Slider Atsortingbutes zoomSlider.Minimum = 1; zoomSlider.Maximum = 5; zoomSlider.SmallChange = 1; zoomSlider.LargeChange = 1; zoomSlider.UseWaitCursor = false; SetPictureBoxSize(); // reduce flickering this.DoubleBuffered = true; } // picturebox size changed sortingggers 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 au format .net, System.Drawing.Drawing2D.InterpolationMode propose les méthodes de redimensionnement suivantes:

  • Bicubique
  • Bilinéaire
  • Haute
  • HighQualityBicubic
  • Haute QualitéBilinéaire
  • Faible
  • Voisin le plus proche
  • Défaut