Domanda

Ho un bitmap maschera (bmpMask) che sto disegnando su una bitmap di destinazione (bmpDest). Entrambi bitmap con canali alfa ma sono già pieno di contenuti opaco.

Quello che voglio fare è produrre aree trasparenti utilizzando GDI + 'Disegna ...' metodi su bmpMask in modo che bmpDest mostra attraverso quando disegno bmpMask su di esso.

Naturalmente gMask.DrawLine(Pens.Transparent, 0, y, wMax, y) provoca alcun cambiamento al bmpMask, perché lavora GDI + come previsto e non disegna nulla quando trasparente. Anche con i colori semitrasparenti, solo la R, G, B i valori dei pixel di bmpMask vengono aggiornati.

Ma quello che voglio fare è questione di un metodo draw che cambierà il canale alfa di bmpMask quindi è trasparente quando viene disegnata sul bmpDest. So che posso fare questo con SetPixel o più veloci alternative non sicuri o Marshall, ma che potrebbero causare una soluzione molto più complicato. Grazie.

È stato utile?

Soluzione

Trovato 'la' risposta dopo 3 anni!

Non ho mai avuto il tempo di provare la soluzione di Dan, quindi non voglio prendere lontano da essa, ma questo esattamente quello che voglio:

    ' (setting composting mode is the key to getting the transparent
    ' line to actually result in setting the pixels to transparent-
    ' instead of just not drawing anything 'because it's transparent dummy' - 
    ' because it turns off the 'math' that is done to cause transparent
    ' image drawing to occur and just verbatim copies the bits).
    g1.CompositingMode = Drawing2D.CompositingMode.SourceCopy
    g1.DrawLine(Pens.Transparent, 0, y, wMax, y)
    g1.CompositingMode = Drawing2D.CompositingMode.SourceOver

CompostingMode è la chiave! Stavo finalmente cercando di risolvere il problema ancora una volta questa mancanza nel mio programma, e una ricerca su Google alzato questa voce che non ha nulla a che fare con quello che ho cercato (hey, Google può leggere la tua mente).

Graphics.DrawImage è troppo lento per le immagini più grandi?

Meraviglioso! Ora 10 dollari che, nessuno nel mondo intero legge mai questo. 755

Altri suggerimenti

Per quanto ne so, l'unico modo per modificare il canale alfa è, come dici tu, per usare i puntatori (naturalmente, molto meglio) SetPixel o. A seconda di cosa si sta cercando di fare per, potrebbero cavarsela con l'uso creativo di un ColorMatrix. Che vi permetterà di modificare un'operazione DrawImage in modo tale che si può scambiare il significato di R / G / B / A, come si disegna. Prova questo per avere un'idea:

        using ( var bmp = new Bitmap( 100, 100 ) )
        using ( var g = Graphics.FromImage( bmp ) )
        using ( var ia = new ImageAttributes() )
        {
            float R = 1;
            float G = 0;
            float B = 0;
            ia.SetColorMatrix( new ColorMatrix( new float[][] {
                new float[] {1, 0, 0, R, 0},
                new float[] {0, 1, 0, G, 0},
                new float[] {0, 0, 1, B, 0},
                new float[] {0, 0, 0, 0, 0},
                new float[] {0, 0, 0, 0, 1}} ) );
            g.Clear( Color.White );
            g.FillEllipse( Brushes.Blue, 10, 10, 30, 30 );
            g.FillEllipse( Brushes.Red, 60, 10, 30, 30 );
            g.FillEllipse( Brushes.Green, 10, 60, 30, 30 );
            g.FillEllipse( Brushes.Black, 60, 60, 30, 30 );
            e.Graphics.DrawImage(
                bmp,
                new Rectangle( 0, 0, 100, 100 ),
                0, 0, 100, 100,
                GraphicsUnit.Pixel,
                ia );
        }

Prova modificando R / G / B per 1 rispettivamente e vedere come cambia che colori che escono solido / trasparente. Ma, se si deve desidera modificare il canale alfa del bitmap direttamente, ecco come fare: noreferrer immagini soft bordati in GDI +.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top