2008-08-26 15 views
17

Estoy usando StretchImage porque la caja se puede cambiar de tamaño con divisores. Parece que el valor predeterminado es algún tipo de filtrado bilineal uniforme, lo que hace que mi imagen sea borrosa y tenga patrones de muaré.¿Cómo hago para que un PictureBox use el remuestreo del vecino más cercano?

+1

lo que no hay manera real de hacer esto? de alguna manera fácil? – Luiscencio

+0

@Luiscencio: así es como se ve. Tendrá que hacerlo usted mismo con un nuevo mapa de bits del tamaño apropiado y luego Graphics.DrawImage –

+0

Debe marcar JYelton answer. :) – Pedro77

Respuesta

24

que necesitaba esta funcionalidad además. Hice una clase que hereda cuadro de imagen, anula OnPaint y añade una propiedad para permitir el modo de interpolación para ajustar:

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

Muy agradable. Creo que PanAndZoomPictureBox de EmguCV hace lo mismo. ¿Conoces algún problema de rendimiento al hacerlo? – Pedro77

+0

No he tenido ninguna diferencia de rendimiento mensurable cambiando el modo de interpolación de esta manera. – JYelton

+0

Humm bueno. ¡Jared Updike debería marcar tu respuesta! :) – Pedro77

5

Sospecho que tendrá que hacer el cambio de tamaño manualmente a través de la clase de imagen y la función DrawImage y responder a los eventos de cambio de tamaño en el PictureBox.

0

Al cambiar el tamaño de una imagen en .NET, el System.Drawing.Drawing2D.InterpolationMode ofrece los siguientes métodos: redimensionar

  • Bicúbico
  • bilineales
  • alta
  • HighQualityBicubic
  • HighQualityBilinear
  • Bajo
  • Más cercano eighbor
  • defecto
+0

No veo cómo responde esto a la pregunta del OP. – JYelton

3

Hice una búsqueda de MSDN y resulta que hay un artículo sobre esto, que no es muy detallado, pero destaca que se debe utilizar el evento de dibujo.

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

he editado una imagen comúnmente disponibles ejemplo el zoom para utilizar esta función, véase más adelante

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

espero que esto ayude

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

¿Qué evento está conectado a su método picBox_Paint_1? sería en alguna otra parte de tu código. –

+0

Sí, está en el código del diseñador de formulario: this.picBox.Paint + = new System.Windows.Forms.PaintEventHandler (this.picBox_Paint_1); – ardunn

Cuestiones relacionadas