Condividi tramite


Uso della modalità interpolazione per controllare la qualità delle immagini durante il ridimensionamento

La modalità di interpolazione di un oggetto Graphics influenza la modalità di scalabilità di Windows GDI+ (estensioni e compattazioni) delle immagini. L'enumerazione InterpolationMode in Gdiplusenumenums.h definisce diverse modalità di interpolazione, alcune delle quali sono visualizzate nell'elenco seguente:

  • InterpolationModeNearestNeighbor
  • InterpolationModeBilinear
  • InterpolationModeHighQualityBilinear
  • InterpolationModeBicubic
  • InterpolationModeHighQualityBicubic

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 con scalabilità orizzontale. Gli algoritmi che producono immagini con scalabilità superiore tendono a richiedere più tempo di elaborazione. Nell'elenco precedente InterpolationModeNearestNeighbor è la modalità di qualità più bassa e InterpolationModeHighQualubic è 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.

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