Comment puis-je faire en sorte qu'une PictureBox utilise le rééchantillonnage du voisin le plus proche ?
-
09-06-2019 - |
Question
J'utilise StretchImage car la boîte est redimensionnable avec des séparateurs.Il semble que la valeur par défaut soit une sorte de filtrage bilinéaire fluide, ce qui rend mon image floue et présente des motifs moirés.
La solution
J'avais également besoin de cette fonctionnalité.J'ai créé une classe qui hérite de PictureBox, remplace OnPaint
et ajoute une propriété pour permettre de définir le mode d'interpolation :
using System.Drawing.Drawing2D;
using System.Windows.Forms;
/// <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);
}
}
Autres conseils
Je suppose que vous devrez effectuer le redimensionnement manuellement via la classe Image et la fonction DrawImage et répondre aux événements de redimensionnement sur PictureBox.
J'ai fait une recherche MSDN et il s'avère qu'il existe un article à ce sujet, qui n'est pas très détaillé mais souligne que vous devez utiliser l'événement paint.
http://msdn.microsoft.com/en-us/library/k0fsyd4e.aspx
J'ai édité un exemple de zoom d'image couramment disponible pour utiliser cette fonctionnalité, voir ci-dessous
Edité à partir de : http://www.dotnetcurry.com/ShowArticle.aspx?ID=196&AspxAutoDetectCookieSupport=1
J'espère que cela t'aides
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);
}
Lors du redimensionnement d'une image dans .net, System.Drawing.Drawing2D.InterpolationMode propose les méthodes de redimensionnement suivantes :
- Bicubique
- Bilinéaire
- Haut
- HauteQualitéBicubique
- HauteQualitéBilinéaire
- Faible
- Voisin le plus proche
- Défaut