2009-04-03 8 views
3

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


# 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 выводит данные как тип «ctypes.c_char_Array_829440», и мне нужно, чтобы превратить его в строку питона, так что я могу построить QImage. В настоящее время мой механизм копирования занимает почти 300 мс на изображение, поэтому он очень медленный. Часть декодирования и отображения процесса занимает всего около 50 мс.

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

ответ

6

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

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

+0

Большое спасибо, функция string_at сделала трюк. Мне действительно нужно лучше читать документы. Я проверил их несколько раз и все еще пропустил это! – chrism1