【问题标题】:Ctypes malloc for image datactypes malloc 用于图像数据
【发布时间】:2021-01-09 20:46:20
【问题描述】:

我正在尝试使用 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);

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

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

谁能告诉我该怎么做?

【问题讨论】:

    标签: python ctypes


    【解决方案1】:

    下面将分配一个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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多