Procedura: utilizzare una matrice di colori per impostare i valori alfa nelle immagini

La classe Bitmap, che eredita dalla classe Image, e la classe ImageAttributes forniscono funzionalità per ottenere e impostare i valori dei pixel. È possibile utilizzare la classe ImageAttributes per modificare i valori alfa per un'intera immagine, oppure chiamare il metodo SetPixel della classe Bitmap per modificare i valori dei singoli pixel.

Esempio

La classe ImageAttributes ha molte proprietà utilizzabili per modificare le immagini durante il rendering. Nell'esempio che segue, un oggetto ImageAttributes viene utilizzato per impostare tutti i valori alfa sull'80% del valore precedente. Questa operazione viene eseguita inizializzando una matrice di colori e impostando il valore di adattamento alfa nella matrice su 0,8. L'indirizzo della matrice di colori viene passato al metodo SetColorMatrix dell'oggetto ImageAttributes e l'oggetto ImageAttributes viene passato al metodo DrawString dell'oggetto Graphics.

Durante il rendering i valori alfa nell'immagine bitmap sono ridotti del 80%, con il conseguente risultato di un'immagine sfumata rispetto allo sfondo. Come mostrato dall'illustrazione riportata di seguito, l'immagine bitmap è trasparente e attraverso di essa è possibile vedere la linea nera a tinta unita.

Fusione alfa con una matrice

Nel punto in cui si sovrappone alla parte bianca dello sfondo l'immagine viene sfumata con il bianco, mentre dove si sovrappone alla linea nera viene sfumata con il nero.

        ' Create the Bitmap object and load it with the texture image.
        Dim bitmap As New Bitmap("Texture.jpg")

        ' Initialize the color matrix.
        ' Note the value 0.8 in row 4, column 4.
        Dim matrixItems As Single()() = { _
           New Single() {1, 0, 0, 0, 0}, _
           New Single() {0, 1, 0, 0, 0}, _
           New Single() {0, 0, 1, 0, 0}, _
           New Single() {0, 0, 0, 0.8F, 0}, _
           New Single() {0, 0, 0, 0, 1}}

        Dim colorMatrix As New ColorMatrix(matrixItems)

        ' Create an ImageAttributes object and set its color matrix.
        Dim imageAtt As New ImageAttributes()
        imageAtt.SetColorMatrix( _
           colorMatrix, _
           ColorMatrixFlag.Default, _
           ColorAdjustType.Bitmap)

        ' First draw a wide black line.
        e.Graphics.DrawLine( _
           New Pen(Color.Black, 25), _
           New Point(10, 35), _
           New Point(200, 35))

        ' Now draw the semitransparent bitmap image.
        Dim iWidth As Integer = bitmap.Width
        Dim iHeight As Integer = bitmap.Height

        ' Pass in the destination rectangle (2nd argument) and the x _
        ' coordinate (3rd argument), x coordinate (4th argument), width _
        ' (5th argument), and height (6th argument) of the source rectangle.
        e.Graphics.DrawImage( _
           bitmap, _
           New Rectangle(30, 0, iWidth, iHeight), _
           0.0F, _
           0.0F, _
           iWidth, _
           iHeight, _
           GraphicsUnit.Pixel, _
           imageAtt)

// Create the Bitmap object and load it with the texture image.
Bitmap bitmap = new Bitmap("Texture.jpg");

// Initialize the color matrix.
// Note the value 0.8 in row 4, column 4.
float[][] matrixItems ={ 
   new float[] {1, 0, 0, 0, 0},
   new float[] {0, 1, 0, 0, 0},
   new float[] {0, 0, 1, 0, 0},
   new float[] {0, 0, 0, 0.8f, 0}, 
   new float[] {0, 0, 0, 0, 1}};
ColorMatrix colorMatrix = new ColorMatrix(matrixItems);

// Create an ImageAttributes object and set its color matrix.
ImageAttributes imageAtt = new ImageAttributes();
imageAtt.SetColorMatrix(
   colorMatrix,
   ColorMatrixFlag.Default,
   ColorAdjustType.Bitmap);

// First draw a wide black line.
e.Graphics.DrawLine(
   new Pen(Color.Black, 25),
   new Point(10, 35),
   new Point(200, 35));

// Now draw the semitransparent bitmap image.
int iWidth = bitmap.Width;
int iHeight = bitmap.Height;
e.Graphics.DrawImage(
   bitmap,
   new Rectangle(30, 0, iWidth, iHeight),  // destination rectangle
   0.0f,                          // source rectangle x 
   0.0f,                          // source rectangle y
   iWidth,                        // source rectangle width
   iHeight,                       // source rectangle height
   GraphicsUnit.Pixel,
   imageAtt);

Compilazione del codice

L'esempio riportato in precedenza è stato creato per essere utilizzato con Windows Form e richiede PaintEventArgs e un parametro di PaintEventHandler.

Vedere anche

Altre risorse

Grafica e disegno in Windows Form

Linee e riempimenti con fusione alfa