Gewusst wie: Verwenden des Interpolationsmodus zum Steuern der Bildqualität während der Skalierung

Der Interpolationsmodus eines Graphics-Objekts beeinflusst die Art und Weise, wie Bilder in GDI+ skaliert (gestreckt bzw. verkleinert) werden. Durch die InterpolationMode-Enumeration werden mehrere Interpolationsmodi definiert, von denen einige im Folgenden aufgelistet sind:

Zum Strecken eines Bildes muss jedes Pixel des Originalbilds einer Gruppe von Pixeln im größeren Bild zugeordnet werden. Zum Verkleinern eines Bildes müssen Pixelgruppen im Originalbild einzelnen Pixeln im kleineren Bild zugeordnet werden. Die Qualität eines skalierten Bildes hängt von der Effizienz der Algorithmen ab, durch die diese Zuordnungen berechnet werden. Algorithmen, die höherwertige skalierte Bilder produzieren, erfordern tendenziell eine höhere Verarbeitungszeit. Die Einstellung NearestNeighbor aus der vorangehenden Liste entspricht dem Modus mit der niedrigsten und die Einstellung HighQualityBicubic dem Modus mit der höchsten Qualität.

Um den Interpolationsmodus festzulegen, weisen Sie der InterpolationMode-Eigenschaft eines Graphics-Objekts einen der Member der InterpolationMode-Enumeration zu.

Beispiel

Im folgenden Beispiel wird ein Bild gezeichnet, das anschließend mit drei verschiedenen Interpolationsmodi verkleinert wird.

In der folgenden Abbildung sind das Originalbild sowie die drei kleineren Bilder dargestellt.

Bild mit unterschiedlichen Interpolationseinstellungen

        Dim image As New Bitmap("GrapeBunch.bmp")
        Dim width As Integer = image.Width
        Dim height As Integer = image.Height

        ' Draw the image with no shrinking or stretching. Pass in the destination
        ' rectangle (2nd argument), the upper-left corner (3rd and 4th arguments),
        ' width (5th argument),  and height (6th argument) of the source 
        ' rectangle.
        e.Graphics.DrawImage( _
            image, _
            New Rectangle(10, 10, width, height), _
            0, _
            0, _
            width, _
            height, _
            GraphicsUnit.Pixel, _
            Nothing)

        ' Shrink the image using low-quality interpolation. 
        e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor

        ' Pass in the destination rectangle, and the upper-left corner, width, 
        ' and height of the source rectangle as above.
        e.Graphics.DrawImage( _
        image, _
        New Rectangle(10, 250, CInt(0.6 * width), CInt(0.6 * height)), _
        0, _
        0, _
        width, _
        height, _
        GraphicsUnit.Pixel)

        ' Shrink the image using medium-quality interpolation.
        e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear

        ' Pass in the destination rectangle, and the upper-left corner, width, 
        ' and height of the source rectangle as above.
        e.Graphics.DrawImage( _
        image, _
        New Rectangle(150, 250, CInt(0.6 * width), _
        CInt(0.6 * height)), _
        0, _
        0, _
        width, _
        height, _
        GraphicsUnit.Pixel)

        ' Shrink the image using high-quality interpolation.
        e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic

        ' Pass in the destination rectangle, and the upper-left corner, width, 
        ' and height of the source rectangle as above.
        e.Graphics.DrawImage( _
            image, _
            New Rectangle(290, 250, CInt(0.6 * width), CInt(0.6 * height)), _
            0, _
            0, _
            width, _
            height, _
            GraphicsUnit.Pixel)

Image image = new Bitmap("GrapeBunch.bmp");
int width = image.Width;
int height = image.Height;

// Draw the image with no shrinking or stretching.
e.Graphics.DrawImage(
    image,
    new Rectangle(10, 10, width, height),  // destination rectangle  
    0,
    0,           // upper-left corner of source rectangle
    width,       // width of source rectangle
    height,      // height of source rectangle
    GraphicsUnit.Pixel,
    null);

// Shrink the image using low-quality interpolation. 
e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
e.Graphics.DrawImage(
   image,
    new Rectangle(10, 250, (int)(0.6 * width), (int)(0.6 * height)),
    // destination rectangle 
    0,
    0,           // upper-left corner of source rectangle
    width,       // width of source rectangle
    height,      // height of source rectangle
    GraphicsUnit.Pixel);

// Shrink the image using medium-quality interpolation.
e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear;
e.Graphics.DrawImage(
    image,
    new Rectangle(150, 250, (int)(0.6 * width), (int)(0.6 * height)),
    // destination rectangle 
    0,
    0,           // upper-left corner of source rectangle
    width,       // width of source rectangle
    height,      // height of source rectangle
    GraphicsUnit.Pixel);

// Shrink the image using high-quality interpolation.
e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
e.Graphics.DrawImage(
    image,
    new Rectangle(290, 250, (int)(0.6 * width), (int)(0.6 * height)),
    // destination rectangle 
    0,
    0,           // upper-left corner of source rectangle
    width,       // width of source rectangle
    height,      // height of source rectangle
    GraphicsUnit.Pixel);

Kompilieren des Codes

Das vorhergehende Beispiel ist für die Verwendung mit Windows Forms konzipiert und erfordert PaintEventArgs e, einen Parameter des Paint-Ereignishandlers.

Siehe auch

Weitere Ressourcen

Bilder, Bitmaps und Metadateien

Arbeiten mit Bildern, Bitmaps, Symbolen und Metadateien