visual startposition propiedad poner pantalla formulario form centro c# .net winforms gdi+ picturebox

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



propiedad size c# (4)

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.


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


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