Ich verwende StretchImage, weil die Box mit Splittern skalierbar ist. Es sieht so aus, als wäre die Voreinstellung eine sanfte bilineare Filterung, die dazu führt, dass mein Bild verschwommen ist und Moiré-Muster aufweist.Wie kann ich mit einer PictureBox das Near-Neighbor-Resampling verwenden?
Antwort
ich diese Funktionalität benötigen ebenfalls. Ich habe eine Klasse, die PictureBox erbt, überschreibt OnPaint
und fügt eine Eigenschaft der Interpolation Modus zu ermöglichen, eingestellt werden:
/// <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);
}
}
Sehr schön. Ich denke PanAndZoomPictureBox von EmguCV macht das selbe. Ist Ihnen ein Leistungsproblem bekannt? – Pedro77
Ich hatte keine messbaren Leistungsunterschiede, die den Interpolationsmodus auf diese Weise veränderten. – JYelton
Humm gut. Jared Updike sollte deine Antwort markieren! :) – Pedro77
Ich vermute, Sie müssen die Größenänderung manuell durch die Image-Klasse und DrawImage-Funktion tun und auf die Größenänderungsereignisse auf der PictureBox reagieren.
Wenn Sie ein Bild in .net Ändern der Größe, die System.Drawing.Drawing2D.InterpolationMode bietet folgende Größe ändern Methoden:
- Bicubic
- Bilineare
- Hoch
- HighQualityBicubic
- HighQualityBilinear
- Niedrig
- NearestN eighbor
- Standard
Ich sehe nicht, wie dies die Frage des OP adressiert. – JYelton
Ich habe ein MSDN-Suche und stellt sich heraus, es ist ein Artikel zu diesem Thema, die nicht sehr detailliert, sondern skizziert, dass Sie das Paint-Ereignis verwenden soll.
http://msdn.microsoft.com/en-us/library/k0fsyd4e.aspx
ich eine allgemein verfügbare Bild zoomen Beispiel bearbeiten diese Funktion zu nutzen, siehe unten
von Editiert: http://www.dotnetcurry.com/ShowArticle.aspx?ID=196&AspxAutoDetectCookieSupport=1
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);
}
Welches Ereignis ist mit Ihrer Methode picBox_Paint_1 verbunden? Es wäre in einem anderen Teil Ihres Codes. –
Ja, es ist in der Form Designer-Code: this.picBox.Paint + = neu System.Windows.Forms.PaintEventHandler (this.picBox_Paint_1); – ardunn
so gibt es keine tatsächliche Möglichkeit, dies zu tun? auf eine einfache Art und Weise? – Luiscencio
@Luiscencio: so sieht es aus. Sie müssen es selbst mit einem neuen Bitmap der passenden Größe machen und dann Graphics.DrawImage –
Sie sollten JYelton Antwort markieren. :) – Pedro77