尝试混合2种颜色时溢出异常

时间:2014-03-22 22:16:51

标签: vb.net colors vb6 migration type-conversion

我有2种颜色来自旧的VB6格式。

在这种情况下,这两种颜色是vbBlack和vbBlack。 我需要混合/混合它们。

在VB6中说我只是说:

Public Function BlendColors(ByVal lColor1 As Long, ByVal lColor2 As Long) As Long
    BlendColors = RGB( _
        ((lColor1 And &HFF) + (lColor2 And &HFF)) / 2, _
        (((lColor1 \ &H100) And &HFF) + ((lColor2 \ &H100) And &HFF)) / 2, _
        (((lColor1 \ &H10000) And &HFF) + ((lColor2 \ &H10000) And &HFF)) / 2)
End Function

现在使用VB.NET,我首先必须将这两个Win32颜色代码转换为Color。

我正在使用

Public Function IntegerToColor(ByVal uColorValue As Integer) As Color
    Dim nColor As Color = ColorTranslator.FromWin32(uColorValue)
    Return nColor
End Function

然后我使用以下函数实际混合这些颜色:

Dim nBlendedColor As Color = Color.FromArgb((c1.A + c2.A) \ 2,
                                            (c1.R + c2.R) \ 2,
                                            (c1.G + c2.G) \ 2,
                                            (c1.B + c2.B) \ 2)

然而,这个函数抛出OverflowException告诉我,我可能不会除以0。

我做错了什么?

3 个答案:

答案 0 :(得分:3)

你得到OverflowException "算术运算导致溢出。" 。问题是A,R,G,B值是字节,并且那些值只能在0到255之间。添加其中两个可能超出此范围。因此,在添加它们之前将它们转换为整数。

Public Function BlendColors(ByVal c1 As Color, ByVal c2 As Color) As Color
    Return Color.FromArgb((CInt(c1.A) + CInt(c2.A)) \ 2, _
        (CInt(c1.R) + CInt(c2.R)) \ 2, _
        (CInt(c1.G) + CInt(c2.G)) \ 2, _
        (CInt(c1.B) + CInt(c2.B)) \ 2)
End Function

注意:如果Strict选项设置为On,这是一件好事,VB将不会像VB6那样自动完成所有转换。为什么这样好?因为你知道自己在做什么。否则,编译器会引入您不知道的转换,这可能是意外的甚至是有害的。当知道更大的类型是合适的时,VB仍然会扩展转换。例如,您可以通过仅转换其中一个术语来简化上述计算:CInt(c1.R) + c2.R。在这种情况下,c2.R会自动转换为Integer,以使其与CInt(c1.R)的类型相匹配。

答案 1 :(得分:0)

使用完全相同的BlendColors功能,你不能这样做:

Dim winColor1 As Integer = &HA000
Dim winColor2 As Integer = &HB000

Dim blendedWinColor as Integer = BlendColors(winColor1, winColor2)
Dim BlendedColor as Color = ColorTranslator.FromWin32(blendedWinColor)

干杯

答案 2 :(得分:0)

c1.A,c1.B,c1.G等是BYTES所以adition可能会溢出。将c1.A更改为CInt(c1.A)以及相应的其他人。

瓦尔特