Condividi tramite


Uso della modalità interpolazione per controllare la qualità dell'immagine durante il ridimensionamento

La modalità di interpolazione di un oggetto Graphics influenza il modo in cui Windows GDI+ ridimensiona le immagini (estende e riduce). L'enumerazione InterpolationMode in Gdiplusenums.h definisce diverse modalità di interpolazione, alcune delle quali sono illustrate nell'elenco seguente:

  • Modalità di Interpolazione Vicino più Prossimo
  • Modalità di Interpolazione Bilineare
  • ModalitàInterpolazioneBilineareAltaQualità
  • Modalità di Interpolazione Bicubica
  • ModalitàInterpolazioneBicubicaAltaQualità

Per estendere un'immagine, ogni pixel nell'immagine originale deve essere mappato a un gruppo di pixel nell'immagine più grande. Per compattare un'immagine, i gruppi di pixel nell'immagine originale devono essere mappati a singoli pixel nell'immagine più piccola. L'efficacia degli algoritmi che eseguono questi mapping determina la qualità di un'immagine ridimensionata. Gli algoritmi che producono immagini con scalabilità più elevata tendono a richiedere più tempo di elaborazione. Nell'elenco precedente InterpolationModeNearestNeighbor è la modalità di qualità più bassa e InterpolationModeHighQualityBicubic è la modalità di massima qualità.

Per impostare la modalità di interpolazione, passare uno dei membri dell'enumerazione InterpolationMode al metodo SetInterpolationMode di un oggetto Graphics.

L'esempio seguente disegna un'immagine e quindi compatta l'immagine con tre diverse modalità di interpolazione:

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

La figura seguente mostra l'immagine originale e le tre immagini più piccole.

illustrazione che mostra un'immagine originale di grandi dimensioni e le tre immagini più piccole di qualità variabile