Поделиться через


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

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

  • Режим интерполяции ближайшего соседа
  • РежимИнтерполяцииБилинейный
  • ИнтерполяцияРежимВысокоеКачествоБилинейная
  • ИнтерполяцияРежимБикубический
  • РежимИнтерполяцииВысокогоКачестваБикубическая

Чтобы растянуть изображение, каждый пиксель в исходном изображении должен быть сопоставлен с группой пикселей в большом изображении. Чтобы уменьшить изображение, группы пикселей в исходном изображении должны быть сопоставлены с одним пикселями в меньшем изображении. Эффективность алгоритмов, выполняющих эти сопоставления, определяет качество масштабируемого изображения. Алгоритмы, создающие более качественные масштабируемые изображения, как правило, требуют больше времени обработки. В предыдущем списке InterpolationModeNearestNeighbor является режимом самого низкого качества, а InterpolationModeHighQualityBicubic — режимом самого высокого качества.

Чтобы задать режим интерполяции, передайте один из элементов перечисления 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);

На следующем рисунке показан исходный образ и три небольших изображения.

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