c# visual ¿Cómo hago para que un PictureBox use el remuestreo del vecino más cercano?




startposition c# (4)

Hice una búsqueda de MSDN y resulta que hay un artículo sobre esto, que no es muy detallado, pero describe que debe usar el evento de pintura.

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

Edité un ejemplo de zoom de imagen comúnmente disponible para usar esta función, ver a continuación

Editado desde: 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);
    }

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é.


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

  • Bicubic
  • Bilinear
  • Alto
  • HighQualityBicubic
  • HighQualityBilinear
  • Bajo
  • Vecino más cercano
  • Defecto

Sospecho que vas a tener 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.


Necesitaba esta funcionalidad también. Hice una clase que hereda PictureBox, anula OnPaint y agrega una propiedad para permitir que se establezca el modo de interpolación:

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




picturebox