pycharm将动图分解成逐帧图片,再将逐帧图片展示在QLable中,滑块控制帧数
时间: 2024-06-09 13:07:24 浏览: 98
二维动作观赏,逐帧控制
实现这个功能需要用到以下几个模块:
1. PyQt5:用于构建 GUI 界面;
2. OpenCV:用于读取动图并分解成逐帧图片;
3. Pillow:用于将图片转换成 PyQt5 可以显示的格式。
下面是实现步骤:
1. 安装 PyQt5、OpenCV 和 Pillow 模块。
```python
pip install PyQt5 opencv-python pillow
```
2. 创建一个 PyQT5 窗口,包含一个 QLabel 和一个 QSlider。
```python
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSlider, QVBoxLayout
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('动图播放器')
self.setGeometry(100, 100, 600, 600)
self.label = QLabel(self)
self.slider = QSlider(self)
vbox = QVBoxLayout()
vbox.addWidget(self.label)
vbox.addWidget(self.slider)
self.setLayout(vbox)
```
3. 读取动图并分解成逐帧图片,将图片存储在一个列表中。
```python
import cv2
class MainWindow(QWidget):
def __init__(self):
# ...
self.frames = []
cap = cv2.VideoCapture('动图.gif')
while True:
ret, frame = cap.read()
if not ret:
break
self.frames.append(frame)
cap.release()
```
4. 将逐帧图片转换成 PyQt5 可以显示的格式,并将第一帧图片显示在 QLabel 中。
```python
from PIL import Image
from PyQt5.QtGui import QPixmap, QImage
class MainWindow(QWidget):
def __init__(self):
# ...
self.images = []
for frame in self.frames:
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
image = Image.fromarray(image)
self.images.append(image)
self.current_frame = 0
self.update_image()
def update_image(self):
image = self.images[self.current_frame]
image = image.resize((self.label.width(), self.label.height()))
qimage = QImage(image.tobytes(), image.width, image.height,
QImage.Format_RGB888)
pixmap = QPixmap.fromImage(qimage)
self.label.setPixmap(pixmap)
```
5. 使用 QSlider 控制当前显示的帧数。
```python
from PyQt5.QtCore import Qt
class MainWindow(QWidget):
def __init__(self):
# ...
self.slider.setRange(0, len(self.frames)-1)
self.slider.setOrientation(Qt.Horizontal)
self.slider.valueChanged.connect(self.slider_changed)
def slider_changed(self, value):
self.current_frame = value
self.update_image()
```
完整代码如下:
阅读全文