Seltsames Verhalten, wenn ein Colormatrix zu einem Bild in .Net appying, WinForms
-
20-09-2019 - |
Frage
Die folgenden Verfahren findet eine Farbmatrix und wendet sie auf die zugeführten Bild. Es gibt ein paar Dinge zu beachten:
(1) Es ist nicht eine Funktion
(2) Das gleiche Bild verwendet wird, um das Grafik-Objekt zu erzeugen, und als Quelle der DrawImage Methode.
Public Sub ApplyMatrixToImage(ByVal matrix As ColorMatrix, ByVal image As Image)
Using atts As New ImageAttributes
atts.SetColorMatrix(matrix)
Using g As Graphics = Graphics.FromImage(image)
Dim width As Integer = image.Width
Dim height As Integer = image.Height
Dim rect As New Rectangle(0, 0, width, height)
g.DrawImage(image, rect, 0, 0, width, height, GraphicsUnit.Pixel, atts)
End Using
End Using
End Sub
Ich weiß nicht, ob es die schlechte Praxis nicht eine andere Bitmap zu erstellen das fertige Bild in machen, aber das Merkwürdige ist die Methode funktioniert gut für einen Farbabgleich (Matrix30, 31 und 32), aber tut nichts für eine Opazität Einstellung (Matrix33).
Was ist los?
Lösung
Wenn Ich verstehe Ihre Frage richtig: Sie fragen, warum Sie nicht den Alpha-Kanal mit dieser Methode ändern können? (Warum sollte es eine Funktion statt eines Unter elludes mich vollständig sein.)
Aber warum es nicht funktioniert, wie Sie mit opactiy erwarten kann / Transparenz verstehe ich vollkommen. : -)
Die .DrawImage Verfahren (mit den Imageattributes kombiniert) wird jedes geänderten Pixel auf sich selbst DRAW (da die Breite und Höhe gleich sind). Beachten Sie, dass es ziehen - nicht ersetzen . Dies bedeutet, dass der ursprüngliche Pixelwert wird Mischung mit dem neu berechneten Pixelwert. Unter anderem, dass dies bedeutet, wenn das ursprüngliche Pixel, wenn völlig undurchsichtig, gibt es keine Möglichkeit, dass das wird sich ändern. Malerei mit einer teilweise transpararent Farbe über etwas undurchsichtig wird noch eine undurchsichtige Farbe yieald.