Frage

Ich möchte ein Bild mit der GDI-Bibliothek, um die Größe, so dass, wenn ich es die Größe als größer zu sein, bevor keine Vermischung gibt. (Wie, wenn Sie mit dem Zoom auf einem Bild in einem Malprogramm)

Beispiel: Wenn mein Bild ist 2px breit und 2px hoch
(Weiß, weiß,
weiß, schwarz)
Und ich die Größe 100% größer zu sein, wird es durch 4px hoch
4px (Weiß, weiß, weiß, weiß,
weiß, weiß, weiß, weiß,
weiß, weiß, schwarz, schwarz,
weiß, weiß, schwarz, schwarz)

Was InterpolationMode oder Glättungsmodus (oder andere Objekte) eines Grafikobjekts kann ich diese nutzen zu erreichen? Die Kombinationen, die ich versucht habe bisher alle verursachen grau im Testbild angezeigt wird.

Hier ist der Code, den ich verwende

    /// <summary>
    /// Do the resize using GDI+
    /// Credit to the original author
    /// http://www.bryanrobson.net/dnn/Code/Imageresizing/tabid/69/Default.aspx
    /// </summary>
    /// <param name="srcBitmap">The source bitmap to be resized</param>
    /// <param name="width">The target width</param>
    /// <param name="height">The target height</param>
    /// <param name="isHighQuality">Shoule the resize be done at high quality?</param>
    /// <returns>The resized Bitmap</returns>

    public static Bitmap Resize(Bitmap srcBitmap, int width, int height, bool isHighQuality)
    {
        // Create the destination Bitmap, and set its resolution
        Bitmap destBitmap = new Bitmap((int)Convert.ToInt32(width), (int)Convert.ToInt32(height), PixelFormat.Format24bppRgb);
        destBitmap.SetResolution(srcBitmap.HorizontalResolution, srcBitmap.VerticalResolution);

        // Create a Graphics object from the destination Bitmap, and set the quality
        Graphics grPhoto = Graphics.FromImage(destBitmap);
        if (isHighQuality)
        {
            grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            grPhoto.InterpolationMode = InterpolationMode.HighQualityBicubic;
        }
        else
        {
            grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None; //? this doesn't work
            grPhoto.InterpolationMode = InterpolationMode.NearestNeighbor; //? this doesn't work


        }
        // Do the resize
        grPhoto.DrawImage(srcBitmap,
              new Rectangle(0, 0, width, height),
              new Rectangle(0, 0, srcBitmap.Width, srcBitmap.Height),
              GraphicsUnit.Pixel);

        grPhoto.Dispose();
        return destBitmap;
    }
War es hilfreich?

Lösung

Sie waren auf dem richtigen Weg durch InterpolationMode.NearestNeighbor verwenden. Doch mit dem Standard PixelOffsetMode, wird GDI + versuchen und Probe an den Pixelkanten, die Mischung zu verursachen.

Um die Skalierung ohne Vermischung zu erhalten, müssen Sie auch PixelOffsetMode.Half verwenden. Ändern Sie Ihre Nicht-Qualitätsfall an:

else
{
    grPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    grPhoto.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
}

Andere Tipps

Wenn Sie das Bild zeichnen und in dem Quellrechteck vorbei, passieren nur die gezoomten in Teil des ursprünglichen Bildes und das Gebiet des größeren ziehen. Wenn der Benutzer zoomt, irgendwann werden sie nicht in der Lage sein, das gesamte Bild im Anzeigebereich zu sehen. Also, herauszufinden, welches Source-Bereich noch in Sicht sein sollte und malt nur das.

Es sieht nicht wie Sie etwas falsch mit mir zu tun sind. Beachten Sie die Anweisungen von Microsoft auf dem InterpolationMode:

http://msdn.microsoft.com/en-us/library/ms533836 (VS .85) aspx

Vielleicht ist diese Funktion perfekt funktioniert, aber Sie es die falschen Parameter oder Anzeigen des Ergebnisses falsch sind zu geben?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top