تحويل البيانات CTYPES إلى سلسلة بيثون في أسرع وقت ممكن

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

  •  23-08-2019
  •  | 
  •  

سؤال

أحاول كتابة تطبيق فيديو في Pyqt4 واستخدمت بيثون CTTYPES لربط مكتبة فك ترميز الفيديو القديم القديم. تعطيني المكتبة بيانات Argb 32 بت وأحتاج إلى تحويل ذلك إلى 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)

المشكلة هي أن CTTYPES يخرج البيانات كنوع "ctypes.c_char_Array_829440"وأحتاج إلى تحويلها إلى سلسلة بيثون حتى أتمكن من إنشاء Qimage. تتناول آلية النسخ الخاصة بي حاليا ما يقرب من 300ms لكل صورة بحيث تكون بطيئة بشكل مؤلم. فك شفرة وعرض جزء من العملية يستغرق فقط حوالي 50 مللي ثانية.

هل يمكن لأي شخص أن يفكر في أي اختصارات الماكرة التي يمكنني اتخاذها لتسريع هذه العملية وتجنب الحاجة إلى نسخ المخزن المؤقت مرتين وأنا أفعل حاليا؟

هل كانت مفيدة؟

المحلول

ال ctypes.c_char_Array_829400 مثيل لديه الممتلكات .raw الذي يعيد سلسلة ربما تحتوي على بايت الخلايا، والعقار .value الذي يعيد السلسلة حتى أول بايت NUL إذا كان يحتوي على واحد أو أكثر.

ومع ذلك، يمكنك أيضا استخدام ctypes الوصول إلى السلسلة في self.rgb_buffer_ptr, ، مثله:ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size); ؛ هذا من شأنه تجنب الحاجة إلى مكالمة memmove.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top