Ctypes malloc用于图像数据

问题描述

我正在尝试使用ctypes包装以下c函数

    #define MAX_IMAGE_WIDTH 1024
    #define MAX_IMAGE_HEIGHT 1024
    UFE_STATUS ufe_res;
    char szFileName[256];
    unsigned char* pImage;
    int nWidth;
    int nHeight;

    // Get file name from user,szFileName

    // Allocate image buffer
    pImage = (unsigned char*)malloc(MAX_IMAGE_WIDTH,MAX_IMAGE_HEIGHT);
    ufe_res = UFE_LoadImageFromBMPFile(szFileName,pImage,&nWidth,&nHeight);

但是,我不知道如何使用像这样的ctypes在python中分配内存:

pImage = (unsigned char*)malloc(MAX_IMAGE_WIDTH,MAX_IMAGE_HEIGHT);

有人可以告诉我该怎么做吗?

解决方法

以下内容将分配一个char数组。 c_char * N创建大小为N的一维数组:

image = (c_char * (MAX_IMAGE_WIDTH * MAX_IMAGE_HEIGHT))()

请注意,括号很重要:

>>> import ctypes
>>> x=10
>>> y=20
>>> ctypes.c_char * x * y                      # 2D char[y][x] equivalent type
<class '__main__.c_char_Array_10_Array_20'>    # note order of x and y above
>>> ctypes.c_char * (x * y)                    # 1D char[x*y] equivalent type
<class '__main__.c_char_Array_200'>
>>> (ctypes.c_char * (x*y))()                  # instance of char[x*y] array.
<__main__.c_char_Array_200 object at 0x0000014CBB9AF848>
>>> i = (ctypes.c_char * x * y)()              # instance of 2D char[y][x] array.
>>> i[19]                                      # first dimension is y
<__main__.c_char_Array_10 object at 0x0000014CBB9AF848>
>>> i[19][9]                                   # 2nd dimension is x
b'\x00'

上面可以创建任何类型的数组。如果您需要c_charc_wchar数组,则可以使用:

>>> ctypes.create_string_buffer(x * y)
<__main__.c_char_Array_200 object at 0x0000014CBB9AF9C8>
>>> ctypes.create_unicode_buffer(x * y)
<ctypes.c_wchar_Array_200 object at 0x0000014CBB9AF848>