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.