Comportamento estranho ao aceitar uma colormadora a uma imagem em .net, winforms
-
20-09-2019 - |
Pergunta
O método abaixo pega uma matriz de cores e a aplica à imagem fornecida. Há algumas coisas a serem observadas:
(1) não é uma função
(2) A mesma imagem é usada para criar o objeto gráfico e como fonte do método de drawimage.
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
Não sei se é uma prática ruim não criar outro bitmap para renderizar a imagem final, mas o estranho é que o método funciona bem para um ajuste de equilíbrio de cores (Matrix30, 31 e 32), mas não faz nada para um ajuste de opacidade (Matrix33).
O que está acontecendo?
Solução
Se Eu entendo sua pergunta corretamente: você está perguntando por que não pode alterar o canal alfa com esse método? (Por que deve ser uma função em vez de me submeter completamente.)
Mas por que não funciona como você pode esperar com opactiy/transparência que eu entendo perfeitamente. :-)
O método .Drawimage (combinado com os imageattributes) atrairá cada pixel alterado para si (já que a largura e a altura são os mesmos). Observe que vai empate - não substituir. Isso significa que o valor original do pixel mistura com o valor de pixel recém -calculado. Entre outras coisas, isso significa que, se o pixel original, se completamente opaco, não há como isso mudar. Pintar com uma cor parcialmente transpareente sobre algo opaco ainda será uma cor opaca.