Превращение данных ctypes в строку python как можно быстрее

StackOverflow https://stackoverflow.com/questions/714367

  •  23-08-2019
  •  | 
  •  

Вопрос

Я пытаюсь написать видеоприложение на PyQt4 и использовал Python ctypes для подключения к старой устаревшей библиотеке видеодекодера.Библиотека предоставляет мне 32-разрядные ARGB-данные, и мне нужно превратить их в QImage.У меня это работает следующим образом:


# Copy the rgb image data from the pointer into the buffer
memmove(self.rgb_buffer, self.rgb_buffer_ptr, self.buffer_size)

# Copy the buffer to a python string
imgdata = ""
for a in self.rgb_buffer:
    imgdata = imgdata + a

# Create a QImage from the string data
img = QImage(imgdata, 720, 288, QImage.Format_ARGB32)

Проблема в том, что ctypes выводит данные как type "ctypes.c_char_Array_829440" и мне нужно превратить это в строку python, чтобы я мог создать QImage.Мой механизм копирования в настоящее время занимает почти 300 мс на изображение, так что это мучительно медленно.Часть процесса декодирования и отображения занимает всего около 50 мс.

Кто-нибудь может придумать какие-нибудь хитрые ярлыки, которые я могу использовать, чтобы ускорить этот процесс и избежать необходимости копировать буфер дважды, как я делаю сейчас?

Это было полезно?

Решение

В ctypes.c_char_Array_829400 экземпляр обладает свойством .raw который возвращает строку, возможно, содержащую нулевые байты, и свойство .value который возвращает строку вплоть до первого нулевого байта, если она содержит один или несколько.

Однако вы также можете использовать ctypes для доступа к строке по адресу self.rgb_buffer_ptr, вот так:ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size);это позволило бы избежать необходимости в вызове memmove.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top