2013-04-11 51 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