Wie kann ich dafür sorgen, dass eine PictureBox das Nearest-Neighbor-Resampling verwendet?
-
09-06-2019 - |
Frage
Ich verwende StretchImage, weil die Größe der Box mit Splittern geändert werden kann.Es sieht so aus, als wäre die Standardeinstellung eine Art sanfte bilineare Filterung, die dazu führt, dass mein Bild verschwommen ist und Moiré-Muster aufweist.
Lösung
Ich brauchte diese Funktionalität auch.Ich habe eine Klasse erstellt, die PictureBox erbt und überschreibt OnPaint
und fügt eine Eigenschaft hinzu, um das Festlegen des Interpolationsmodus zu ermöglichen:
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);
}
}
Andere Tipps
Ich vermute, dass Sie die Größenänderung manuell über die Image-Klasse und die DrawImage-Funktion durchführen und auf die Größenänderungsereignisse in der PictureBox reagieren müssen.
Ich habe eine MSDN-Suche durchgeführt und festgestellt, dass es dazu einen Artikel gibt, der nicht sehr detailliert ist, aber darlegt, dass Sie das Paint-Ereignis verwenden sollten.
http://msdn.microsoft.com/en-us/library/k0fsyd4e.aspx
Ich habe ein allgemein verfügbares Bildzoom-Beispiel bearbeitet, um diese Funktion zu verwenden, siehe unten
Bearbeitet von: http://www.dotnetcurry.com/ShowArticle.aspx?ID=196&AspxAutoDetectCookieSupport=1
Hoffe das hilft
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);
}
Bei der Größenänderung eines Bildes in .net bietet System.Drawing.Drawing2D.InterpolationMode die folgenden Größenänderungsmethoden:
- Bikubisch
- Bilinear
- Hoch
- HochwertigeBikubik
- HighQualityBilinear
- Niedrig
- Nächster Nachbar
- Standard