Python 在C中解包(r,g,b)原始像素缓冲区

Python 在C中解包(r,g,b)原始像素缓冲区,python,c,arrays,bitmap,ctypes,Python,C,Arrays,Bitmap,Ctypes,目前正在尝试将C用于以前在python pypy中完成的作业。我想我应该试着用C语言编写它,以获得最佳的速度,并使用ctypes进行通信 现在我要做的是从位图bmp文件中获取pixelbuffer,将其发送到C函数,该函数将原始缓冲区转换为R、G、B值的平面数组,并将其返回到python。但我在尝试将缓冲区转换为R、G、B值时遇到了问题。 在python中,我只需使用struct模块:B,G,R=struct.unpack'您正在执行array[I]它不清楚您在char*数组中接收图像的格式。假

目前正在尝试将C用于以前在python pypy中完成的作业。我想我应该试着用C语言编写它,以获得最佳的速度,并使用ctypes进行通信

现在我要做的是从位图bmp文件中获取pixelbuffer,将其发送到C函数,该函数将原始缓冲区转换为R、G、B值的平面数组,并将其返回到python。但我在尝试将缓冲区转换为R、G、B值时遇到了问题。
在python中,我只需使用struct模块:B,G,R=struct.unpack'您正在执行array[I]它不清楚您在char*数组中接收图像的格式。假设每个数组元素有一个字节,则无需进行任何移位:

 while(i < length) {
    printf("%d, ", (unsigned int)array[i++]); //B 
    printf("%d, ", (unsigned int)array[i++]); //G
    printf("%d\n", (unsigned int)array[i++]); //R
  }
但是,请记住,图像的每一行都可以有一些填充,因此只有当数组对应于一行且长度不包括填充时,这才有效。

您将char指针强制转换为int指针,这会导致奇怪的数字。你不需要投下它,但如果你必须投下结果。像这样:

printf("%d, ", (char)(array[i] << 8)); //B 

在char*数组中有什么?每个字节一个样本?即使解决了:@leonbloy,这是正确的。这只是一个测试,看看解决方案是否是位移位。没有比特转移,这是同样的问题。。例如,我的4x4 bmp 0,0中的第一个像素是33620225、5052877067372035,应该是1,1,1。。。同样的问题也伴随着位移位。但解决方案正如您所编辑的:intarray[i]似乎已解决,删除了位移位,因为没有任何原因,并使用printf%d,intarray[i];非常感谢你!是的,我知道填充,在将缓冲区发送到C之前,我已经移除了它。您的帖子以及unxnuts帖子就是我问题的答案!非常感谢。
 while(i < length) {
    printf("%d, ", (unsigned int)array[i++]); //B 
    printf("%d, ", (unsigned int)array[i++]); //G
    printf("%d\n", (unsigned int)array[i++]); //R
  }
printf("%d, ", (char)(array[i] << 8)); //B