Странное поведение при применении ColorMatrix к изображению в .Net, WinForms

StackOverflow https://stackoverflow.com/questions/2465948

Вопрос

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

(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) НАРИСУЕТ каждый измененный пиксель на себя (поскольку ширина и высота одинаковы).Обратите внимание, что это будет рисовать - нет заменять.Это означает, что исходное значение пикселя будет смешивать с новым рассчитанным значением пикселя.Помимо прочего, это означает, что если исходный пиксель полностью непрозрачен, это никак не изменится.Нанесение частично прозрачного цвета поверх непрозрачного объекта все равно даст непрозрачный цвет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top