将ColorMatrix应用于.Net,WinForms中的图像时出现奇怪的行为

时间:2010-03-17 21:10:57

标签: c# .net vb.net gdi+ colormatrix

下面的方法采用颜色矩阵并将其应用于提供的图像。有几点需要注意:

(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 个答案:

答案 0 :(得分:3)

如果我理解你的问题:你问为什么你不能用这种方法改变alpha通道? (为什么它应该是一个函数而不是一个子函数完全脱离了我。)

但是为什么它不能像你所期望的那样以不透明/透明度完全理解。 : - )

.DrawImage方法(与ImageAttributes结合使用)会将每个更改的像素绘制到自身上(因为宽度和高度相同)。请注意,它将绘制 - 而不是替换。这意味着原始像素值将混合与新计算的像素值。除此之外,这意味着如果原始像素完全不透明,则无法改变。在不透明的东西上涂上部分透明的颜色仍然会产生不透明的颜色。