Как создать массив беззнаковых символов в Python? (Для glReadPixels с использованием PyOpenGL) - PullRequest
2 голосов
/ 07 мая 2020

Я написал код на GLES2 и EGL, используя PyOpenGL, мне нужно использовать функцию glReadPixels, за исключением того, что последний аргумент должен быть беззнаковым символьным буфером ctypes, который я не знаю, как его создать. это код C:

unsigned char* buffer = malloc(width * height * 4);
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

Каким будет эквивалент Python кода?

Я использую GLES2, а не GL, поэтому buffer = glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE) не работает.

При попытке buffer = glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE) я получаю следующую ошибку:

   buffer = glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE)
  File "/home/fa/berryconda3/lib/python3.6/site-packages/OpenGL/platform/baseplatform.py", line 415, in __call__
    return self( *args, **named )
TypeError: this function takes at least 7 arguments (6 given)

1 Ответ

2 голосов
/ 07 мая 2020

Создать байтовый буфер подходящего размера:

buffer_size = width * height * 4
buffer = (GLbyte * buffer_size)()

Передать буфер glReadPixels:

glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer)

Это то же самое, что использовать ctypes.c_byte:

import ctypes
buffer_size = width * height * 4
buffer = (ctypes.c_byte * buffer_size)()

Или создайте буфер numpy подходящего размера:

import numpy
buffer = numpy.empty(width * height * 4, "uint8")

Передайте буфер glReadPixels:

glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer)
...