Condividi tramite


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.

illustrazione che mostra un'immagine che diventa più opaca da sinistra a destra, su un rettangolo nero

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 .