Странное поведение при применении ColorMatrix к изображению в .Net, WinForms - PullRequest
0 голосов
/ 18 марта 2010

Метод ниже, берет цветовую матрицу и применяет ее к предоставленному изображению. Следует отметить несколько вещей:

(1) Это не функция
(2) Это же изображение используется для создания графического объекта и в качестве источника метода 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

Я не знаю, является ли плохой практикой не создавать еще одно растровое изображение для визуализации конечного изображения, но странным является то, что метод отлично работает для регулировки цветового баланса (Matrix30, 31 и 32), но ничего не делает для регулировка непрозрачности (Matrix33).

Что происходит?

1 Ответ

3 голосов
/ 18 марта 2010

Если Я правильно понимаю ваш вопрос: вы спрашиваете, почему вы не можете изменить альфа-канал этим методом? (Почему это должно быть функцией, а не подсвечивать меня полностью.)

Но почему это не работает так, как вы можете ожидать с непрозрачностью / прозрачностью, я прекрасно понимаю. : -)

Метод .DrawImage (в сочетании с ImageAttributes) будет рисовать каждый измененный пиксель на себя (так как ширина и высота одинаковы). Обратите внимание, что вытянет , а не заменит . Это означает, что исходное значение пикселя будет смешиваться с вновь рассчитанным значением пикселя. Среди прочего, это означает, что если исходный пиксель полностью непрозрачен, это никак не изменится. Окрашивание частично прозрачным цветом поверх непрозрачного будет по-прежнему непрозрачным.

...