0

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

(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)。

这是怎么回事?

4

1 回答 1

3

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

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

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

于 2010-03-18T09:43:25.370 回答