Impostazione dei valori alfa dei singoli pixel
L'argomento Uso di una matrice di colori per impostare i valori alfa nelle immagini mostra un metodo non distruttivo per modificare i valori alfa di un'immagine. L'esempio in tale argomento esegue il rendering semitrasparente di un'immagine, ma i dati pixel nella bitmap non vengono modificati. I valori alfa vengono modificati solo durante il rendering.
Nell'esempio seguente viene illustrato come modificare i valori alfa dei singoli pixel. Il codice nell'esempio modifica effettivamente le informazioni alfa in un oggetto Bitmap . L'approccio è molto più lento rispetto all'uso di una matrice di colori e di un oggetto ImageAttributes , ma consente di controllare i singoli pixel nella bitmap.
INT iWidth = bitmap.GetWidth();
INT iHeight = bitmap.GetHeight();
Color color, colorTemp;
for(INT iRow = 0; iRow < iHeight; iRow++)
{
for(INT iColumn = 0; iColumn < iWidth; iColumn++)
{
bitmap.GetPixel(iColumn, iRow, &color);
colorTemp.SetValue(color.MakeARGB(
(BYTE)(255 * iColumn / iWidth),
color.GetRed(),
color.GetGreen(),
color.GetBlue()));
bitmap.SetPixel(iColumn, iRow, colorTemp);
}
}
// First draw a wide black line.
Pen pen(Color(255, 0, 0, 0), 25);
graphics.DrawLine(&pen, 10, 35, 200, 35);
// Now draw the modified bitmap.
graphics.DrawImage(&bitmap, 30, 0, iWidth, iHeight);
La figura seguente mostra l'immagine risultante.
L'esempio di codice precedente usa cicli annidati per modificare il valore alfa di ogni pixel nella bitmap. Per ogni pixel, Bitmap::GetPixel ottiene il colore esistente, Color::SetValue crea un colore temporaneo che contiene il nuovo valore alfa e quindi Bitmap::SetPixel imposta il nuovo colore. Il valore alfa viene impostato in base alla colonna della bitmap. Nella prima colonna alfa è impostato su 0. Nell'ultima colonna alfa è impostato su 255. L'immagine risultante passa quindi da completamente trasparente (sul bordo sinistro) a completamente opaca (sul bordo destro).
Bitmap::GetPixel e Bitmap::SetPixel offrono il controllo dei singoli valori di pixel. Tuttavia, l'uso di Bitmap::GetPixel e Bitmap::SetPixel non è quasi veloce quanto l'uso della classe ImageAttributes e della struttura ColorMatrix .