Использование режима интерполяции для управления качеством изображения во время масштабирования

Режим интерполяции графического объекта влияет на то, как Windows GDI+ масштабирует (растягивает и сжимает) изображения. Перечисление InterpolationMode в Gdiplusenums.h определяет несколько режимов интерполяции, некоторые из которых показаны в следующем списке:

  • ИнтерполяцияModeNearestNeighbor
  • ИнтерполяцияModeBilinear
  • ИнтерполяцияModeHighQualityBilinear
  • ИнтерполяцияModeBicubic
  • ИнтерполяцияModeHighQualityBicubic

Чтобы растянуть изображение, каждый пиксель этого исходного изображения должен быть сопоставлен группе пикселей увеличенного изображения. Чтобы сжать изображение, группы пикселей этого исходного изображения должны быть сопоставлены отдельным пикселям уменьшенного изображения. Качество масштабированного изображения определяется алгоритмами, используемыми для осуществления этих сопоставлений. Алгоритмы, создающие более качественные масштабированные изображения, обычно требуют больших затрат машинного времени. В предыдущем списке интерполяцияModeNearestNeighbor является режимом самого низкого качества, а ИнтерполяцияModeHighQualityBicubic — режимом самого высокого качества.

Чтобы задать режим интерполяции, передайте один из членов перечисления InterpolationMode в метод SetInterpolationMode объекта Graphics .

В следующем примере рисуется изображение, а затем сжимается изображение с тремя различными режимами интерполяции:

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);

На рисунке ниже показаны как исходное изображение, так и три варианта уменьшенного изображения.

иллюстрация, показывающая большое исходное изображение и три небольших изображения разного качества