java – 将ARGB颜色值反转为ABGR的快速算法?
发布时间:2020-12-14 05:45:00 所属栏目:Java 来源:网络整理
导读:我正在使用IntBuffer来操作Bitmap的像素,但缓冲区中的值应该是AABBGGRR,而颜色常量是AARRGGBB.我知道我可以使用Color.argb,Color.a,…来反转,但我认为它并不完美. 我需要操作非常多的像素,所以我需要一种能够在短时间内执行此运算符的算法.我想到了这个Bit E
我正在使用IntBuffer来操作Bitmap的像素,但缓冲区中的值应该是AABBGGRR,而颜色常量是AARRGGBB.我知道我可以使用Color.argb,Color.a,…来反转,但我认为它并不完美.
我需要操作非常多的像素,所以我需要一种能够在短时间内执行此运算符的算法.我想到了这个Bit Expression,但它不正确: 0xFFFFFFFF ^ pSourceColor 如果没有更好的,也许我将使用位移操作符(执行Color.a,…)而不是调用函数来减少时间. 编辑: 这是我目前转换的函数,虽然我认为应该有更好的算法(更少的运算符)来执行它: private int getBufferedColor(final int pSourceColor) { return ((pSourceColor >> 24) << 24) | // Alpha ((pSourceColor >> 16) & 0xFF) | // Red -> Blue ((pSourceColor >> 8) & 0xFF) << 8 | // Green ((pSourceColor) & 0xFF) << 16; // Blue -> Red } 解决方法
由于A和G已经到位,你可以通过屏蔽B和R然后再添加它们来做得更好.没有测试过,但应该是95%的权利:
private static final int EXCEPT_R_MASK = 0xFF00FFFF; private static final int ONLY_R_MASK = ~EXCEPT_R_MASK; private static final int EXCEPT_B_MASK = 0xFFFFFF00; private static final int ONLY_B_MASK = ~EXCEPT_B_MASK; private int getBufferedColor(final int pSourceColor) { int r = (pSourceColor & ONLY_R_MASK) >> 16; int b = pSourceColor & ONLY_B_MASK; return (pSourceColor & EXCEPT_R_MASK & EXCEPT_B_MASK) | (b << 16) | r; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |