Wie male ich einen Bereich einer Bitmap mit 'transparent white'?

8

Ich möchte alle Pixel in einem rechteckigen Bereich einer Bitmap durch 'transparentes Weiß' ersetzen - d. h. a = 0, b = 255, r = 255, g = 255.

FillRectangle tut dies nicht - bei einem transparenten Pinsel sind die vorhandenen Pixel unverändert.

Muss ich SetPixel einzeln für jedes Pixel im Rechteck verwenden?

    
mackenir 21.05.2010, 14:45
quelle

6 Antworten

13

Sie müssen die Eigenschaft Graphics.CompositingMode festlegen. Zum Beispiel:

%Vor%

Die tatsächliche Farbe, die Sie verwenden, spielt keine Rolle, Sie erhalten ein schwarzes Rechteck mit einem Alpha von 0.

    
Hans Passant 21.05.2010, 15:11
quelle
3

Ich glaube, dass Sie SetPixel verwenden müssen (oder eine gleichwertige Methode, um die Farbwerte direkt einzustellen), um die Pixel "transparent weiß" zu erhalten.

Sie können die Methode Graphics.Clear verwenden, um die Farbe oder die Pixel festzulegen, aber Sie können sie nicht verwenden, um sie sowohl als transparent als auch als Farbe festzulegen. Ich habe das versucht, um die Pixel in einem Teil einer Bitmap zu setzen:

%Vor%

Die Pixel in der Region enden als "transparentes Schwarz": 0,0,0,0. Auch das Zeichnen eines durchgehenden weißen Rechtecks ​​vor dem Löschen hilft nicht. Wenn das Alpha in einer Farbe Null ist, sind die anderen Farbkomponenten ebenfalls Null.

Wenn Sie ein fast transparentes Alpha wie 1 verwenden, werden die Pixel als "fast transparent weiß" angezeigt: 1.255.255.255.

    
Guffa 21.05.2010 15:05
quelle
2

Wenn Sie die Composite-Malmethoden verwenden, wird das Alpha verwendet, um die Farbe zu überblenden, damit nichts passiert.

Wenn Sie die Bitmap festlegen möchten, erstellen Sie sie entweder aus Daten mit dem gewünschten Hintergrund oder legen Sie den Hintergrund mit LockBits , um die Daten en masse zu bearbeiten.

Sie können möglicherweise auch eine Bitblt-Methode mit den entsprechenden Flags verwenden, aber ich weiß nicht, wie ich das in verwalteten Code umwandeln soll.

    
Pete Kirkham 21.05.2010 14:53
quelle
1

Wichtiger Tipp:

Stellen Sie sicher, dass Sie beim Erstellen des Bildes dies tun

%Vor%

und nicht

%Vor%

Es wird dir einige Schwierigkeiten ersparen. Nimm nicht an, dass 32 Bit Alphakanal bedeutet ;-)

    
Simon_Weaver 28.04.2011 05:09
quelle
0

Dieser kleine Hack sollte den Trick machen:

%Vor%     
C.Evenhuis 21.05.2010 14:57
quelle
0
  

FillRectangle tut dies nicht - bei einem transparenten Pinsel sind die vorhandenen Pixel unverändert.

Sinnvoll, da Sie mit einer Deckkraft von 0% zeichnen. :)

Eine schnelle Lösung für ein Control wäre ein Farbschlüssel. Sie können die Schlüsselfarbe des Steuerelements auf eine bestimmte Farbe (d. H. Magenta) einstellen. Alle Pixel dieser Farbe würden dann transparent dargestellt. (Wenn das Steuerelement es natürlich unterstützt.)

Das oder Bitmap.MakeTransparent (Farbe) für allgemeine Zwecke. Das Problem ist wiederum, dass die angegebene Farbe transparent ist. Sie müssen also eine Farbe auswählen, die nicht im Bild vorhanden ist. (Es gibt ein anderes Beispiel hier: Ссылка )

Bearbeiten: Am Ende könnte der in den anderen Kommentaren erwähnte LockBits () Ansatz das sein, was Sie suchen. Sobald Sie wissen, wie die Breite und die Schrittwerte zusammenwirken, ist es einfach, das Bild auf der niedrigst möglichen Ebene zu bearbeiten. Hier ist ein allgemeines Beispiel: Ссылка Stellen Sie nur sicher, dass das Bild Transparenz unterstützt (siehe PixelFormat), sperren Sie dann das Bild mit einem geeigneten Modus (z. B. PixelFormat.Format32bppArgb), durchlaufen Sie jedes Pixel, lesen Sie nach Bytes, schreiben Sie eine neue Farbe usw.

    
sunside 21.05.2010 14:50
quelle

Tags und Links