我有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。
我做错了什么?
答案 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)
以及相应的其他人。
瓦尔特