0

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

现在我想做的是从位图(bmp 文件)中获取像素缓冲区,将其发送到 C 函数,该函数将原始缓冲区转换为 R、G、B 值的平面数组并将其返回给 python。但是在尝试将“缓冲区”转换为 R、G、B 值时,我遇到了困难。在 python 中,我会简单地使用“struct”模块: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..

C 尝试转换像素失败:

#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;
}
4

3 回答 3

5

目前尚不清楚您在char * array. 假设每个数组元素有一个字节,则不需要进行任何移位:

 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且不包括填充时才有效。

于 2013-04-11T17:39:59.987 回答
2

你所做array[i] << 8的与向左移动array[i]8 位或乘以array[i]256 相同。这就是为什么你会得到巨大的数字。摆脱,<< 8你应该没事。

int此外,在取消引用数组之后进行类型转换。它应该是(int)array[i].

于 2013-04-11T17:39:39.427 回答
0

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

printf("%d, ", (char)(array[i] << 8)); //B 
于 2013-04-11T17:40:18.830 回答