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

Der Interpolationsmodus eines Graphics-Objekts beeinflusst die Art und Weise, wie Windows GDI+-Bilder skaliert (gestreckt und verkleinern) wird. Die InterpolationMode-Enumeration in Gdiplusenums.h definiert mehrere Interpolationsmodi, von denen einige in der folgenden Liste aufgeführt sind:

  • InterpolationModeNearestNeighbor
  • InterpolationModeBilinear
  • InterpolationModeHighQualityBilinear
  • InterpolationModeBicubic
  • InterpolationModeHighQualityBicubic

Um ein Bild zu strecken, muss jedes Pixel im Originalbild einer Gruppe von Pixeln im größeren Bild zugeordnet werden. Um ein Bild zu verkleinern, müssen Gruppen von Pixeln im Originalbild einzelnen Pixeln im kleineren Bild zugeordnet werden. Die Effektivität der Algorithmen, die diese Zuordnungen vornehmen, bestimmt die Qualität eines skalierten Bilds. Algorithmen, die skalierte Bilder von höherer Qualität erzeugen, erfordern tendenziell mehr Verarbeitungszeit. In der vorherigen Liste ist InterpolationModeNearestNeighbor der Modus mit der niedrigsten Qualität, und InterpolationModeHighQualityBicubic ist der Modus mit der höchsten Qualität.

Um den Interpolationsmodus festzulegen, übergeben Sie eines der Member der InterpolationMode-Enumeration an die SetInterpolationMode-Methode eines Graphics-Objekts .

Das folgende Beispiel zeichnet ein Bild und verkleinert das Bild dann mit drei verschiedenen Interpolationsmodi:

Image image(L"GrapeBunch.bmp");
UINT width = image.GetWidth();
UINT height = image.GetHeight();
// Draw the image with no shrinking or stretching.
graphics.DrawImage(
   &image,
   Rect(10, 10, width, height),  // destination rectangle  
   0, 0,        // upper-left corner of source rectangle
   width,       // width of source rectangle
   height,      // height of source rectangle
   UnitPixel);
// Shrink the image using low-quality interpolation. 
graphics.SetInterpolationMode(InterpolationModeNearestNeighbor);
graphics.DrawImage(
   &image,
   Rect(10, 250, 0.6*width, 0.6*height),  // destination rectangle 
   0, 0,        // upper-left corner of source rectangle
   width,       // width of source rectangle
   height,      // height of source rectangle
   UnitPixel);
// Shrink the image using medium-quality interpolation.
graphics.SetInterpolationMode(InterpolationModeHighQualityBilinear);
graphics.DrawImage(
   &image,
   Rect(150, 250, 0.6 * width, 0.6 * height),  // destination rectangle 
   0, 0,        // upper-left corner of source rectangle
   width,       // width of source rectangle
   height,      // height of source rectangle
   UnitPixel);
// Shrink the image using high-quality interpolation.
graphics.SetInterpolationMode(InterpolationModeHighQualityBicubic);
graphics.DrawImage(
   &image,
   Rect(290, 250, 0.6 * width, 0.6 * height),  // destination rectangle 
   0, 0,        // upper-left corner of source rectangle
   width,       // width of source rectangle
   height,      // height of source rectangle
   UnitPixel);

Die folgende Abbildung zeigt das Originalbild und die drei kleineren Bilder.

Abbildung, die ein großes Originalbild und die drei kleineren Bilder mit unterschiedlicher Qualität zeigt