Странное поведение при применении ColorMatrix к изображению в .Net, WinForms
-
20-09-2019 - |
Вопрос
Метод ниже берет цветовую матрицу и применяет ее к предоставленному изображению.Есть несколько вещей, на которые следует обратить внимание:
(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), но ничего не делает для настройки непрозрачности. (Матрица33).
Что происходит?
Решение
Если Я правильно понимаю ваш вопрос:вы спрашиваете, почему нельзя изменить альфа-канал этим методом?(Почему это должна быть функция, а не подпрограмма, мне совершенно непонятно.)
Но почему с opactiy/transparency это не работает так, как можно было бы ожидать, я прекрасно понимаю.:-)
Метод .DrawImage (в сочетании с ImageAttributes) НАРИСУЕТ каждый измененный пиксель на себя (поскольку ширина и высота одинаковы).Обратите внимание, что это будет рисовать - нет заменять.Это означает, что исходное значение пикселя будет смешивать с новым рассчитанным значением пикселя.Помимо прочего, это означает, что если исходный пиксель полностью непрозрачен, это никак не изменится.Нанесение частично прозрачного цвета поверх непрозрачного объекта все равно даст непрозрачный цвет.