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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top