J'utilise StretchImage parce que la boîte est redimensionnable avec des séparateurs. Il semble que le défaut soit un filtrage bilinéaire régulier, ce qui rend mon image floue et moirée.Comment faire pour que PictureBox utilise le rééchantillonnage du plus proche voisin?
Répondre
je avais besoin de cette fonctionnalité aussi. J'ai fait une classe qui hérite PictureBox, remplace OnPaint
et ajoute une propriété pour permettre le mode d'interpolation à définir:
/// <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);
}
}
Très bien. Je pense que PanAndZoomPictureBox d'EmguCV fait la même chose. Connaissez-vous un problème de performance? – Pedro77
Je n'ai eu aucune différence de performance mesurable modifiant le mode d'interpolation de cette manière. – JYelton
Humm bien. Jared Updike devrait marquer votre réponse! :) – Pedro77
Je suppose que vous allez devoir effectuer manuellement le redimensionnement à travers la classe Image et la fonction DrawImage et répondre aux événements de redimensionnement sur le PictureBox.
Lors du redimensionnement d'une image en .net, le System.Drawing.Drawing2D.InterpolationMode offre les méthodes suivantes: redimensionner
- bicubique
- bilinéaire
- Haute
- HighQualityBicubic
- HighQualityBilinear
- Basse
- La plus proche eighbor
- Par défaut
Je ne vois pas comment cela répond à la question de l'OP. – JYelton
je fait une recherche MSDN et se révèle qu'il ya un article sur ce sujet, ce qui est pas très détaillée, mais donne un aperçu que vous devez utiliser l'événement de peinture.
http://msdn.microsoft.com/en-us/library/k0fsyd4e.aspx
J'ai effectué un exemple d'image couramment disponible zoom pour utiliser cette fonctionnalité, voir ci-dessous
Sous la direction de: http://www.dotnetcurry.com/ShowArticle.aspx?ID=196&AspxAutoDetectCookieSupport=1
Hope this helps
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);
}
Quel événement est connecté à votre méthode picBox_Paint_1? ce serait dans une autre partie de votre code. –
Ouais c'est dans le code du concepteur de formulaire: this.picBox.Paint + = new System.Windows.Forms.PaintEventHandler (this.picBox_Paint_1); – ardunn
donc il n'y a aucun moyen réel de le faire? d'une certaine manière facile? – Luiscencio
@Luiscencio: c'est à quoi ça ressemble. Vous devrez le faire vous-même avec un nouveau bitmap de la taille appropriée et ensuite Graphics.DrawImage –
Vous devriez marquer la réponse de JYelton. :) – Pedro77