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?
Sie müssen die Eigenschaft Graphics.CompositingMode
festlegen. Zum Beispiel:
Die tatsächliche Farbe, die Sie verwenden, spielt keine Rolle, Sie erhalten ein schwarzes Rechteck mit einem Alpha von 0.
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:
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.
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.
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 ;-)
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.