def update_frame_image(self, frame_index: int): """ 刷新帧图象显示 :param frame_index: 帧索引 :return: None """ base64 = self._frame_base64_dict[frame_index] byte_arr = QByteArray(base64) img = QImage() img.loadFromData(QByteArray.fromBase64(byte_arr)) pixmap = QPixmap.fromImage(img) self.current_frame_item.setPixmap(pixmap) self.current_frame_index = frame_index
class PreviewWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.mode = Mode.NoMode self.image = QImage() self.zoomed_image = QImage() self.svgRenderer = QSvgRenderer(self) self.zoom_scale = ZOOM_ORIGINAL_SCALE def mode(self): return self.mode def set_mode(self, mode): self.mode = mode def load(self, data): if self.mode == Mode.PngMode: self.image.loadFromData(data) self.setMinimumSize(self.image.rect().size()) elif self.mode == Mode.SvgMode: self.svgRenderer.load(data) self.zoom_image() self.update() # Public slots def zoom_original(self): self.set_zoom_scale(ZOOM_ORIGINAL_SCALE) def zoom_in(self): # new_scale = self.zoom_scale + \ # ZOOM_BIG_INCREMENT if self.zoom_scale >= ZOOM_ORIGINAL_SCALE else ZOOM_SMALL_INCREMENT new_scale = self.zoom_scale + ZOOM_SMALL_INCREMENT if new_scale > MAX_ZOOM_SCALE: new_scale = MAX_ZOOM_SCALE self.set_zoom_scale(new_scale) def zoom_out(self): # new_scale = self.zoom_scale - \ # ZOOM_SMALL_INCREMENT if self.zoom_scale <= ZOOM_ORIGINAL_SCALE else ZOOM_BIG_INCREMENT new_scale = self.zoom_scale - ZOOM_SMALL_INCREMENT if new_scale < MIN_ZOOM_SCALE: new_scale = MIN_ZOOM_SCALE self.set_zoom_scale(new_scale) # Private methods def paintEvent(self, event): painter = QPainter(self) output_size = QSize() if self.mode == Mode.PngMode: output_size = self.zoomed_image.size() output_rect = QRect(QPoint(), output_size) output_rect.translate(self.rect().center() - output_rect.center()) painter.drawImage(output_rect.topLeft(), self.zoomed_image) elif self.mode == Mode.SvgMode: output_size = self.svgRenderer.defaultSize() if self.zoom_scale != ZOOM_ORIGINAL_SCALE: zoom = float(self.zoom_scale) / ZOOM_ORIGINAL_SCALE output_size.scale(output_size.width() * zoom, output_size.height() * zoom, Qt.IgnoreAspectRatio) output_rect = QRect(QPoint(), output_size) output_rect.translate(self.rect().center() - output_rect.center()) self.svgRenderer.render(painter, output_rect) self.setMinimumSize(output_size) def zoom_image(self): if self.mode == Mode.PngMode: if self.zoom_scale == ZOOM_ORIGINAL_SCALE: self.zoomed_image = self.image else: zoom = float(self.zoom_scale) / ZOOM_ORIGINAL_SCALE self.zoomed_image = self.image.scaled( self.image.width() * zoom, self.image.height() * zoom, Qt.IgnoreAspectRatio, Qt.SmoothTransformation) def set_zoom_scale(self, new_scale): if self.zoom_scale != new_scale: self.zoom_scale = new_scale self.zoom_image() self.update()