TypeError: инициализатор для ctype 'unsigned int *' должен быть указателем cdata, а не байтами - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь преобразовать изображение PIL в leptonica PIX.Вот мой код python 3.6:

import os, cffi
from PIL import Image

# initialize leptonica
ffi = cffi.FFI()
ffi.cdef("""
    typedef int           l_int32;
    typedef unsigned int  l_uint32;
    struct                Pix;
    typedef struct Pix    PIX;
    PIX * pixCreate       (int width, int height, int depth);
    l_int32 pixSetData    (PIX *pix, l_uint32 *data);
""")
leptonica = ffi.dlopen(os.path.join(os.getcwd(), "leptonica-1.78.0.dll"))

# convert PIL to PIX
im = Image.open("test.png").convert("RGBA")
depth = 32
width, height = im.size
data = im.tobytes("raw", "RGBA")
pixs = leptonica.pixCreate(width, height, depth)
leptonica.pixSetData(pixs, data)

pixSetData завершается с сообщением: TypeError: initializer for ctype 'unsigned int *' must be a cdata pointer, not bytes.Как преобразовать объект байтов (data) в указатель cdata?

1 Ответ

0 голосов
/ 20 марта 2019

Я получил ответ от Армина Риго на форуме python-cffi :

Если у вас есть недавний cffi 1.12, вы можете сделать:

   leptonica.pixSetData(pixs, ffi.from_buffer("l_uint32[]", data))

Обратная совместимость более сложна, потому что нам нужно убедиться, что промежуточный объект остается живым:

   p = ffi.from_buffer(data)
   leptonica.pixSetData(pixs, ffi.cast("l_uint32 *", p))
   # 'p' must still be alive here after the call, so put it in a variable above!
...