为什么从数组转换为图像时会发生位移?
Why is there bit shifting when converting to an image from an array?
我正在尝试从 numpy 数组创建 QPixmap。 numpy 数组图像将是二维的(即没有颜色信息只有灰度)。
我正在尝试根据我的需要调整此 answer 但是我不太明白这一行:
b = (255 << 24 | a[:,:,0] << 16 | a[:,:,1] << 8 | a[:,:,2]).flatten() # pack RGB values
正在进行一些位移和一些位 or
' ing,但老实说我不太明白。
所以我的简化示例如下:
x, y = np.meshgrid(np.arange(1920), np.arange(1080), indexing='ij'); z = np.sin(0.03*x)*np.cos(0.005*y)
imgPNFN = z
if imgPNFN.ndim == 2:
imgPNFN = imgPNFN[:,:,np.newaxis].repeat(3, 2)
imMin = np.min(imgPNFN)
imDelta = np.max(imgPNFN) - np.min(imgPNFN)
im1 = ((imgPNFN-imMin)/imDelta*255).astype(np.uint32)+1 #<-- had to add 1 for some reason otherwise got weird results...
im2 = 255 << 24 | im1[:,:,0] << 16 | im1[:,:,1] << 8 | im1[:,:,2]
im3 = QtGui.QImage(im2, im2.shape[1], im2.shape[0], QtGui.QImage.Format_RGB32)
这似乎有效,但是当我的图像是 lena 时,即:
from scipy.misc import lena
l = sp.misc.lena()
imgPNFN = l
#etc...
它不起作用...我认为这是因为我对位移正在做什么缺乏了解...另外,如果有更好的方法来处理 RGB(即我正在复制东西假装我有相同的价值观)如果我能以某种方式避免这种情况那就太好了。
提前致谢!
我假设您想知道为什么会发生 bit-shifting 和 or
-ing。那么,您需要将 A[lpha]
、R[ed]
、G[reen]
和 B[lue]
字节连接在一起以形成一个整数值。像素数据是一个二维整数数组;标量值。它们不是字节元组。
例子
颜色:Periwinkle
A: 255 -> 11111111
R: 204 -> 11001100
G: 204 -> 11001100
B: 255 -> 11111111
公式
Value = A << 24 | R << 16 | G << 8 | B
Bit-Math
11111111000000000000000000000000
110011000000000000000000
1100110000000000
+ 11111111
---------------------------------
11111111110011001100110011111111
基础转换
11111111110011001100110011111111
2
= 4291611903
10
终于
根据上面的位操作,在 ARGB 中具有 100% 不透明度的颜色长春花的像素值为 4,291,611,903。
我正在尝试从 numpy 数组创建 QPixmap。 numpy 数组图像将是二维的(即没有颜色信息只有灰度)。
我正在尝试根据我的需要调整此 answer 但是我不太明白这一行:
b = (255 << 24 | a[:,:,0] << 16 | a[:,:,1] << 8 | a[:,:,2]).flatten() # pack RGB values
正在进行一些位移和一些位 or
' ing,但老实说我不太明白。
所以我的简化示例如下:
x, y = np.meshgrid(np.arange(1920), np.arange(1080), indexing='ij'); z = np.sin(0.03*x)*np.cos(0.005*y)
imgPNFN = z
if imgPNFN.ndim == 2:
imgPNFN = imgPNFN[:,:,np.newaxis].repeat(3, 2)
imMin = np.min(imgPNFN)
imDelta = np.max(imgPNFN) - np.min(imgPNFN)
im1 = ((imgPNFN-imMin)/imDelta*255).astype(np.uint32)+1 #<-- had to add 1 for some reason otherwise got weird results...
im2 = 255 << 24 | im1[:,:,0] << 16 | im1[:,:,1] << 8 | im1[:,:,2]
im3 = QtGui.QImage(im2, im2.shape[1], im2.shape[0], QtGui.QImage.Format_RGB32)
这似乎有效,但是当我的图像是 lena 时,即:
from scipy.misc import lena
l = sp.misc.lena()
imgPNFN = l
#etc...
它不起作用...我认为这是因为我对位移正在做什么缺乏了解...另外,如果有更好的方法来处理 RGB(即我正在复制东西假装我有相同的价值观)如果我能以某种方式避免这种情况那就太好了。
提前致谢!
我假设您想知道为什么会发生 bit-shifting 和 or
-ing。那么,您需要将 A[lpha]
、R[ed]
、G[reen]
和 B[lue]
字节连接在一起以形成一个整数值。像素数据是一个二维整数数组;标量值。它们不是字节元组。
例子
颜色:Periwinkle
A: 255 -> 11111111
R: 204 -> 11001100
G: 204 -> 11001100
B: 255 -> 11111111
公式
Value = A << 24 | R << 16 | G << 8 | B
Bit-Math
11111111000000000000000000000000
110011000000000000000000
1100110000000000
+ 11111111
---------------------------------
11111111110011001100110011111111
基础转换
11111111110011001100110011111111
2
= 4291611903
10
终于
根据上面的位操作,在 ARGB 中具有 100% 不透明度的颜色长春花的像素值为 4,291,611,903。