Frage

habe ich eine Maske Bitmap (bmpMask), dass ich auf eine Ziel-Bitmap bin Zeichnung (bmpDest). Beide Bitmaps haben Alpha-Kanäle sind aber bereits voll opaken Inhalt.

Was will ich transparent Bereiche mit GDI + produzieren tun ‚Draw ...‘ Methoden auf bmpMask so dass bmpDest zeigt durch, wenn ich bmpMask darüber ziehen.

Natürlich gMask.DrawLine(Pens.Transparent, 0, y, wMax, y) verursacht keine Änderung bmpMask, da GDI + wie vorgesehen funktioniert und zieht nicht alles transparent, wenn. Selbst mit halbtransparenten Farben, nur die r, g, b-Werte von bmpMask des Pixel werden aktualisiert.

Aber was ich tun möchte, ist ein Unentschieden Methode ausgeben, die den Alpha-Kanal von bmpMask ändern wird, so dass es transparent ist, wenn sie auf bmpDest gezogen. Ich weiß, ich kann dies tun mit SetPixel oder raschere unsicher oder Marshall Alternativen, aber das wäre eine viel kompliziertere Lösung führen. Danke.

War es hilfreich?

Lösung

Gefunden 'die' Antwort nach 3 Jahren!

Ich habe nie versucht, Dan Lösung zu umgehen, so dass ich von ihm wegzunehmen nicht will, aber das ist genau das, was ich will:

    ' (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 ist der Schlüssel! Ich wurde schließlich versucht, diesen Mangel zu beheben, wieder in meinem Programm, und ein Google diesen Artikel aufgedreht Suche, das nichts mit dem zu tun hat, was ich gesucht (hey, Google Ihre Gedanken lesen kann).

Ist Graphics.DrawImage zu langsam für größere Bilder?

Wonderful! Jetzt 10 Dollar sagt, niemand in der ganzen weiten Welt jemals liest. 755

Andere Tipps

Mein Wissen der einzige Weg, den Alpha-Kanal zu ändern ist, wie Sie sagen, zu verwenden SetPixel oder (natürlich viel besser) Zeiger. Je nachdem, was Sie versuchten zu tun, um Sie könnte erhalten, indem mit kreativer Verwendung einer Colormatrix. Das lässt Sie so einen DrawImage Betrieb verändern, dass Sie die Bedeutung von R / G / B / A austauschen können, wie Sie es zeichnen. Versuchen Sie, diese eine Vorstellung zu bekommen:

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

Versuchen Sie, R / G / B 1 jeweils und sehen, wie, dass Veränderungen, welche Farben, die herauskommen fest / transparent. Aber sollten, wenn Sie mögen den Alphakanal der Bitmap direkt verändern, ist hier, wie es geht: Soft kantige Bilder in GDI +.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top