代码之家  ›  专栏  ›  技术社区  ›  Jules

在.net、winforms中将颜色矩阵应用于图像时的奇怪行为

  •  0
  • Jules  · 技术社区  · 14 年前

    下面的方法获取一个颜色矩阵并将其应用于提供的图像。有几件事需要注意:

    (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 回复  |  直到 14 年前
        1
  •  3
  •   Dan Byström    14 年前

    如果 我正确理解你的问题:你在问为什么你不能用这种方法改变α通道?(为什么它应该是一个函数而不是子函数,这让我很困惑。)

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

    DrawImageMethod(结合ImageAttributes)将把每个改变的像素绘制到自身上(因为宽度和高度相同)。注意它会 -不 代替 . 这意味着原始像素值将 混合 使用新计算的像素值。除此之外,这意味着如果原始像素完全不透明,就不可能改变。在不透明的东西上涂上部分透明的颜色仍然会变成不透明的颜色。