VB.NET简单颜色混合操作触发OverflowException,求原因及解决方案
分析颜色混合函数的OverflowException问题
我来帮你拆解下这个问题的根源——你遇到的溢出异常确实和Color.A(以及R/G/B)的类型直接相关!
问题出在哪?
Color的A、R、G、B属性都是Byte类型,取值范围是0-255。当你直接执行color1.A + color2.A时,两个Byte相加的结果默认还是Byte类型。如果两个值的总和超过255(比如255+255=510),就会立刻触发OverflowException——这个溢出发生在相加的瞬间,而不是赋值给变量的时候。
你之前尝试把变量改成Integer/Double、切换\和/运算符都没用,是因为这些操作都是在溢出之后才进行的,根本没解决相加阶段的类型溢出问题。
怎么修复?
解决方法很简单:在相加前把Byte类型转换成Integer,让相加操作在Integer范围内进行(Integer的范围远大于510,不会溢出),然后再计算平均值。修改后的函数可以这样写:
Public Function MixColors(color1 As Color, color2 As Color) As Color Dim a, r, g, b As Integer ' 先转成Integer再相加,避免溢出 a = (CInt(color1.A) + CInt(color2.A)) \ 2 r = (CInt(color1.R) + CInt(color2.R)) \ 2 g = (CInt(color1.G) + CInt(color2.G)) \ 2 b = (CInt(color1.B) + CInt(color2.B)) \ 2 Return Color.FromArgb(a, r, g, b) End Function
或者更简洁一点,直接在Color.FromArgb里计算:
Public Function MixColors(color1 As Color, color2 As Color) As Color Return Color.FromArgb( (CInt(color1.A) + CInt(color2.A)) \ 2, (CInt(color1.R) + CInt(color2.R)) \ 2, (CInt(color1.G) + CInt(color2.G)) \ 2, (CInt(color1.B) + CInt(color2.B)) \ 2 ) End Function
这样就能避免溢出异常,顺利完成颜色混合啦~
内容的提问来源于stack exchange,提问作者des
相关产品推荐
相关产品推荐

