2008-08-26 14 views
17

J'utilise StretchImage parce que la boîte est redimensionnable avec des séparateurs. Il semble que le défaut soit un filtrage bilinéaire régulier, ce qui rend mon image floue et moirée.Comment faire pour que PictureBox utilise le rééchantillonnage du plus proche voisin?

+1

donc il n'y a aucun moyen réel de le faire? d'une certaine manière facile? – Luiscencio

+0

@Luiscencio: c'est à quoi ça ressemble. Vous devrez le faire vous-même avec un nouveau bitmap de la taille appropriée et ensuite Graphics.DrawImage –

+0

Vous devriez marquer la réponse de JYelton. :) – Pedro77

Répondre

24

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

/// <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); 
    } 
} 
+0

Très bien. Je pense que PanAndZoomPictureBox d'EmguCV fait la même chose. Connaissez-vous un problème de performance? – Pedro77

+0

Je n'ai eu aucune différence de performance mesurable modifiant le mode d'interpolation de cette manière. – JYelton

+0

Humm bien. Jared Updike devrait marquer votre réponse! :) – Pedro77

5

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

0

Lors du redimensionnement d'une image en .net, le System.Drawing.Drawing2D.InterpolationMode offre les méthodes suivantes: redimensionner

  • bicubique
  • bilinéaire
  • Haute
  • HighQualityBicubic
  • HighQualityBilinear
  • Basse
  • La plus proche eighbor
  • Par défaut
+0

Je ne vois pas comment cela répond à la question de l'OP. – JYelton

3

je fait une recherche MSDN et se révèle qu'il ya un article sur ce sujet, ce qui est pas très détaillée, mais donne un aperçu que vous devez utiliser l'événement de peinture.

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

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

Sous la direction de: http://www.dotnetcurry.com/ShowArticle.aspx?ID=196&AspxAutoDetectCookieSupport=1

Hope this helps

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

Quel événement est connecté à votre méthode picBox_Paint_1? ce serait dans une autre partie de votre code. –

+0

Ouais c'est dans le code du concepteur de formulaire: this.picBox.Paint + = new System.Windows.Forms.PaintEventHandler (this.picBox_Paint_1); – ardunn