Я пытался отобразить созданные в реальном времени изображения QPixmap внутри QLabel со скоростью 24 кадра в секунду. Это прекрасно работает, когда я использую размер изображения по умолчанию, но когда я пытаюсь масштабировать изображение, это занимает слишком много времени. Масштабирование изображения занимает в среднем 130-160 мс, тогда как мне нужно примерно в 4-5 раз быстрее.
from __future__ import division
from PyQt4.QtGui import QApplication, QMainWindow, QLabel, QPixmap
from PyQt4.QtCore import Qt
Class Main(QMainWindow):
def __init__(self, window_id):
super(Main, self).__init__()
self.window_id = window_id
self.image = QLabel()
self.setCentralWidget(self.image)
def start(self, window_id, fps=24):
self.timer = QTimer()
self.timer.setInterval(1000 / fps)
self.timer.timeout.connect(self.take_screenshot)
self.timer.start()
def take_screenshot(self):
screenshot = QPixmap.grabWindow(self.window_id)
#Scaling takes between 130-160 ms per pixmap
#Needs to be 4-5 times faster to keep up with 24fps
screenshot = screenshot.scaledToWidth(self.image.size().width(), Qt.SmoothTransformation)
self.image.setPixmap(screenshot)
if __name__ == "__main__":
app = QApplication([])
main = Main(app.desktop().winId())
main.start()
main.show()
app.exec_()
У меня есть некоторые ограничения. Примечательно, что мне приходится использовать PyQt4 и Python 2.6 с несколькими невстроенными модулями.
Я пробовал следующее, и ни один из них не оказался достаточно быстрым:
методы QPixmap.scaled*,Метод QPixmap.transformed,
Рисую растровое изображение на этикетке самостоятельно с помощью масштабированного QRect,
Метод QLabel.setScaledContents,
QtOpenGl — не те драйверы
Есть ли у меня какие-либо другие варианты ускорения масштабирования изображений?
Я использовал следующий подкласс QLabel, чтобы попытаться нарисовать QPixmap в масштабированный прямоугольник. >
class Image(QLabel):
def __init__(self):
super(Image, self).__init__()
self.pixmap None
def setPixmap(self, pixmap):
self.pixmap = pixmap
self.update
def paintEvent(self, event):
painter = QPainter(self)
if self.pixmap is not None:
rect = QRect(QPoint(0,0), self.pixmap.size())
painter.drawPixmap(event.rect(), self.pixmap, rect)
painter.end()
Подробнее здесь: https://stackoverflow.com/questions/787 ... -efficient
Как можно сделать масштабирование QPixmap более эффективным? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение