Question

I ai un bitmap de masque (bmpMask) que je dessine sur un bitmap de destination (bmpDest). Les deux bitmaps ont des canaux alpha, mais sont déjà pleines de contenu opaque.

Ce que je veux faire est de produire des zones transparentes à l'aide de GDI + « Draw ... » méthodes sur bmpMask de sorte que bmpDest transparaît quand je dessine bmpMask dessus.

Bien sûr gMask.DrawLine(Pens.Transparent, 0, y, wMax, y) provoque aucun changement à bmpMask, parce que GDI + fonctionne comme prévu et ne dessine rien quand transparent. Même avec des couleurs semi-transparentes, seul le r, g, les valeurs b des pixels de bmpMask sont mis à jour.

Mais ce que je veux faire est un problème de méthode de tirage au sort qui va changer le canal alpha de bmpMask il est transparent quand il est dessiné sur bmpDest. Je sais que je peux le faire avec SetPixel ou alternatives plus rapides dangereuses ou Marshall, mais cela entraînerait une solution beaucoup plus compliquée. Merci.

Était-ce utile?

La solution

trouvé la «réponse au bout de 3 ans!

Je ne ai jamais eu le temps d'essayer la solution de Dan, donc je ne veux pas enlever, mais ce fait exactement ce que je veux:

    ' (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 est la clé! Je suis enfin en train de corriger ce manque encore dans mon programme, et une recherche Google relevai cet article qui n'a rien à voir avec ce que je recherchais (hey, Google peut lire votre esprit).

Graphics.DrawImage est trop lent pour des images plus grandes?

Magnifique! Maintenant 10 dollars dit, personne dans le monde entier lit jamais ce large. 755

Autres conseils

A ma connaissance, la seule façon de modifier le canal alpha est, comme vous le dites, d'utiliser des pointeurs SetPixel ou (bien sûr, beaucoup mieux). En fonction de ce que vous essayez de faire pour vous pourrait vous en tirer avec l'utilisation créative d'un ColorMatrix. Cela vous permettra de modifier une opération DrawImage de telle sorte que vous pouvez interchanger la signification de R / G / B / A que vous dessinez. Essayez ceci pour avoir une idée:

        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 );
        }

Essayez le réglage R / G / B à 1, respectivement, et voir comment cela change les couleurs qui sortent solide / transparent. Mais, si vous devez vous modifier le canal alpha du bitmap directement, voici comment faire: noreferrer images souple tranchants dans GDI +.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top