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