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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top