我有
mask = 255 ('000000FF')
r = uint8(bitand(bitshift(rgb, -16), mask))
此代码是用matlab编写的。现在这段代码在Python中是正确的:
r = (rgb>>16 & mask).astype('uint8')
对于rgb = 1884829820,我得到88作为matlab的答案,而我得到256的Python。我不明白为什么?
答案 0 :(得分:2)
mask = 0xFF # = 255 also works
rgb = 1884829820
r = rgb >> 16 & mask
print(r)
输出:
88
0xFF
是255,而不是256.这是你的问题。
256将创建蒙版0b100000000
答案 1 :(得分:2)
我认为这段代码应该从存储为24位无符号整数的RGB颜色值中提取红色值,其中高位为红色,低位为蓝色。所以mask
需要为255(十六进制为0xff),以便在我们将它们移动到位后从红色通道捕获8位数据。
这是一个小小的Numpy演示。
import numpy as np
np.set_printoptions(formatter={'int': hex})
colors = np.array([0x123456, 0x789abc, 0xdef012, 1884829820], dtype=np.uint32)
print(colors, colors.dtype)
mask = 255
reds = ((colors >>16) & mask).astype(np.uint8)
print(reds, reds.dtype)
<强>输出强>
[0x123456 0x789abc 0xdef012 0x7058387c] uint32
[0x12 0x78 0xde 0x58] uint8
我已经使用十六进制输出来清楚地表明我们实际上已经获得了红色通道位。请注意,0x58 == 88十进制。