2008-08-26 6 views
17

Ich verwende StretchImage, weil die Box mit Splittern skalierbar ist. Es sieht so aus, als wäre die Voreinstellung eine sanfte bilineare Filterung, die dazu führt, dass mein Bild verschwommen ist und Moiré-Muster aufweist.Wie kann ich mit einer PictureBox das Near-Neighbor-Resampling verwenden?

+1

so gibt es keine tatsächliche Möglichkeit, dies zu tun? auf eine einfache Art und Weise? – Luiscencio

+0

@Luiscencio: so sieht es aus. Sie müssen es selbst mit einem neuen Bitmap der passenden Größe machen und dann Graphics.DrawImage –

+0

Sie sollten JYelton Antwort markieren. :) – Pedro77

Antwort

24

ich diese Funktionalität benötigen ebenfalls. Ich habe eine Klasse, die PictureBox erbt, überschreibt OnPaint und fügt eine Eigenschaft der Interpolation Modus zu ermöglichen, eingestellt werden:

/// <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

Sehr schön. Ich denke PanAndZoomPictureBox von EmguCV macht das selbe. Ist Ihnen ein Leistungsproblem bekannt? – Pedro77

+0

Ich hatte keine messbaren Leistungsunterschiede, die den Interpolationsmodus auf diese Weise veränderten. – JYelton

+0

Humm gut. Jared Updike sollte deine Antwort markieren! :) – Pedro77

5

Ich vermute, Sie müssen die Größenänderung manuell durch die Image-Klasse und DrawImage-Funktion tun und auf die Größenänderungsereignisse auf der PictureBox reagieren.

0

Wenn Sie ein Bild in .net Ändern der Größe, die System.Drawing.Drawing2D.InterpolationMode bietet folgende Größe ändern Methoden:

  • Bicubic
  • Bilineare
  • Hoch
  • HighQualityBicubic
  • HighQualityBilinear
  • Niedrig
  • NearestN eighbor
  • Standard
+0

Ich sehe nicht, wie dies die Frage des OP adressiert. – JYelton

3

Ich habe ein MSDN-Suche und stellt sich heraus, es ist ein Artikel zu diesem Thema, die nicht sehr detailliert, sondern skizziert, dass Sie das Paint-Ereignis verwenden soll.

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

ich eine allgemein verfügbare Bild zoomen Beispiel bearbeiten diese Funktion zu nutzen, siehe unten

von Editiert: http://www.dotnetcurry.com/ShowArticle.aspx?ID=196&AspxAutoDetectCookieSupport=1

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

Welches Ereignis ist mit Ihrer Methode picBox_Paint_1 verbunden? Es wäre in einem anderen Teil Ihres Codes. –

+0

Ja, es ist in der Form Designer-Code: this.picBox.Paint + = neu System.Windows.Forms.PaintEventHandler (this.picBox_Paint_1); – ardunn