将 int 颜色转换为 argb
Posted
技术标签:
【中文标题】将 int 颜色转换为 argb【英文标题】:Convert int colours to argb 【发布时间】:2022-01-22 16:15:03 【问题描述】:public static int getARGB(final int red, final int green, final int blue, final int alpha)
int argb = (alpha<<24)|(red<<16)|(green<<8)|blue;
return argb;
所以我必须将不同的颜色整数转换为 argb 值。我的做法对吗?
【问题讨论】:
你忘了应用(0xFF000000
掩码可选到alpha
的移位结果:最左边的位将被丢弃,最右边的位将为零)0xFF0000
到red
的移位结果,0xFF00
到绿色的移位结果,0xFF
到blue
的移位结果。如果我还记得位数学是如何工作的。 :D
您需要检查这些值是否在 [0, 255) 中。如果是,那么你的实现是正确的。
【参考方案1】:
您还应该为每个输入添加一个掩码,以确保它们不大于0xFF
:
int argb = (0xFF & alpha) << 24 | (0xFF & red) << 16 | (0xFF & green) << 8 | (0xFF & blue)
【讨论】:
我猜(0xFF & alpha << 24)
可以简化为alpha << 24
?
@fluffy <<
在java中的优先级高于&
,所以我们需要加上括号(0xFF & alpha) << 24
等等。由于<<
的优先级已经高于|
,所以我们不需要括号;)
我的意思是另一个方面,而不是优先级:int
始终是 32 位,因此将其向左移动 24 位将丢弃最左边的位并填充最右边的 24零......好吧,它是有符号的,所以最右边的 24 位可以是 0 或 1,具体取决于符号,所以是的,它必须先被屏蔽然后移位。感谢您让我在这方面焕然一新!
@fluffy 你是对的,第一部分((0xFF & alpha) << 24
)不需要掩码,因为移位运算符无论如何都会转储最左边的 24 位。但是带有掩码的代码看起来更具可读性,所以我更喜欢它:)
@user16320675 这取决于我要说的应用程序,抛出异常可能并不总是最好的解决方案,尤其是对于应用程序的部署版本。但是我们绝对可以添加一些代码来在超出范围时向控制台抛出警告,或者在我们处于调试模式时抛出异常以上是关于将 int 颜色转换为 argb的主要内容,如果未能解决你的问题,请参考以下文章