2013-04-11 49 views
0

当前正在尝试将C用于之前在python(pypy)中完成的作业。我想我会尝试写在C(为最佳速度),并使用ctypes沟通。开箱(r,g,b)原始像素缓冲区C

现在我想要做的是从位图(bmp文件)中获取像素缓冲区,将其发送到C函数,该函数将原始缓冲区转换为R,G,B值的平面数组并返回它以蟒蛇。但是当我尝试将“缓冲区”转换为R,G,B值时,我陷入了困境。 在Python中,我会简单地使用“结构”模块:B,G,R = struct.unpack('<BBB', buffer[i:i+3])

我应该怎么做在C相同?

的Python:

from bmplib import Bitmap 
import ctypes 
lib = ctypes.CDLL('_bitmap.dll') 

bmp = Bitmap() 
bmp.open('4x4.bmp') 
buf = bmp._rawAsArray() #Returns a array.array() of char (raw pixel-data) 

addr, count = buf.buffer_info() 
lib.getData.argtypes = [] 

arr = ctypes.cast(addr, ctypes.POINTER(ctypes.c_char)) 
lib.getData(arr, count) #Does not return anything yet.. 

失败Ç试图转换像素:

#include <stdio.h> 

void getData(char *, const int); 
void getData(char * array, const int length) { 
    int i = 0; 
    while(i < length) { 
    /* ----- Clearly wrong as i got some HUGE number----- */ 
    printf("%d, ", ((int *) array)[i] << 8); //B 
    printf("%d, ", ((int *) array)[i+1] << 8); //G 
    printf("%d\n", ((int *) array)[i+2] << 8); //R 
    i += 3; 
    } 
    //return total; 
} 
+1

你在'char * array'中有什么?每个字节一个样本? – leonbloy 2013-04-11 17:38:41

+0

即使是这样:@leonbloy,这是正确的。 – JHolta 2013-04-11 18:02:19

回答

2

你正在做的array[i] << 8其是相同array[i] 8位左移,或乘以array[i]由256.这就是为什么你得到了巨大的数字。摆脱<< 8,你应该没问题。

此外,在解引用数组后,将类型转换为int。它应该是(int)array[i]

+0

这只是一个测试,看看解决方案是否存在移位问题。没有偏移,这是同样的问题。EG我的4x4-bmp(0,0)中的第一个像素是'33620225,50528770,67372035',应该是'1,1,1'...同一个probelm与偏移一致。但解决方案是你编辑的:(int)array [i] – JHolta 2013-04-11 17:44:39

+0

所以它似乎被解决了,删除了位移,因为没有理由,并使用了'printf(“%d,”,(int)数组[i]);' 非常感谢! – JHolta 2013-04-11 17:46:58

5

目前还不清楚您在char * array中收到图片的格式。 Assumming你有每个数组元素一个字节,你不需要做任何变化:

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 
    } 

请记住,但是,一个BMP图像可以有一些填充每一行,所以这将工作仅当array对应于单行,并且length不包括填充。

+0

是的,我知道填充,我已经删除它之前发送缓冲区C.您的帖子(以及unxnuts文章)是我的问题的答案!谢谢! – JHolta 2013-04-11 17:49:35

0

您正在投射char - 指向int指针 - 指向奇怪的数字。你不需要施放它,但如果你必须施放结果。像这样:

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