Uso del modo de interpolación para controlar la calidad de la imagen durante el escalado

El modo de interpolación de un objeto Graphics influye en la forma en que windows GDI+ escala (estira y reduce) imágenes. La enumeración InterpolationMode en Gdiplusenums.h define varios modos de interpolación, algunos de los cuales se muestran en la lista siguiente:

  • InterpolationModeNearestNeighbor
  • InterpolationModeBilinear
  • InterpolationModeHighQualityBilinear
  • InterpolationModeBicubic
  • InterpolationModeHighQualityBicubic

Para estirar una imagen, cada píxel de la imagen original debe asignarse a un grupo de píxeles de la imagen más grande. Para reducir una imagen, los grupos de píxeles de la imagen original deben asignarse a píxeles únicos de la imagen más pequeña. La eficacia de los algoritmos que realizan estas asignaciones determina la calidad de una imagen escalada. Los algoritmos que generan imágenes escaladas de mayor calidad tienden a requerir más tiempo de procesamiento. En la lista anterior, InterpolationModeNearestNeighbor es el modo de menor calidad y InterpolationModeHighQualityBicubic es el modo de mayor calidad.

Para establecer el modo de interpolación, pase uno de los miembros de la enumeración InterpolationMode al método SetInterpolationMode de un objeto Graphics .

En el ejemplo siguiente se dibuja una imagen y, a continuación, se reduce la imagen con tres modos de interpolación diferentes:

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

En la ilustración siguiente se muestra la imagen original y las tres imágenes más pequeñas.

ilustración que muestra una imagen original grande y las tres imágenes más pequeñas de calidad variable