【问题标题】:OverflowException when trying to blend 2 colors尝试混合 2 种颜色时出现溢出异常
【发布时间】:2014-04-30 07:57:19
【问题描述】:

我有 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 颜色代码转换为颜色。

我正在使用

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。

我做错了什么?

【问题讨论】:

  • 我不明白需要先转换成Color,然后进行计算。

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


【解决方案1】:

使用完全相同的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】:

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

    变态

    【讨论】:

      【解决方案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) 的类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多