PyQt5 旋转像素图
Posted
技术标签:
【中文标题】PyQt5 旋转像素图【英文标题】:PyQt5 rotation pixmap 【发布时间】:2022-01-21 04:17:24 【问题描述】:在 Pyqt5 中,我想旋转一个像素图,但每次我尝试它都会改变大小。 我的代码是:
import math
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLabel
from PyQt5.QtCore import QObject, QPointF, Qt, QRectF,QRect
from PyQt5.QtGui import QPixmap, QTransform, QPainter
class Window(QWidget):
def __init__(self, *args, **kwargs):
super(Window, self).__init__()
self.arch1 = QPixmap("arch1.png")
pm = QPixmap(556,556)
rectF = QRectF(0,0,556,556)
painter = QPainter(pm)
painter.drawPixmap(rectF, self.arch1, rectF)
painter.end()
self.label = QLabel("AAAAAAAAAA")
self.label.setPixmap(pm)
butA = QPushButton("A")
butA.clicked.connect(lambda: self.rotate_item())
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(butA)
self.setLayout(layout)
self.show()
def rotate_item(self):
rectF = QRectF(0,0,556,556)
self.arch1 = self.arch1.transformed(QTransform().rotate(36))
pix = QPixmap(556,556)
painter = QPainter(pix)
painter.drawPixmap(rectF, self.arch1,QRectF(self.arch1.rect()))
painter.end()
self.label.setPixmap(pix)
def main():
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
if __name__=="__main__":
main()
我只想旋转而不是调整大小。你建议我怎么做? 我有四个其他文件,我想以不同的方式旋转。我发布了一些照片以了解我想要做什么。
还有其他方法吗?
圈一个
圈二
完整的圆圈
【问题讨论】:
请在编辑帖子时更加小心,因为您最近的修改使其完全无法阅读,所以我不得不将其回滚。在提交之前还要检查帖子的预览,并阅读更多关于formatting code的信息。 【参考方案1】:问题是旋转后的像素图有一个更大的边界矩形。
考虑以下示例:
浅蓝色方块显示旋转图像的实际边界矩形,更大。
使用drawPixmap(rectF, self.arch1, QRectF(self.arch1.rect()))
将导致画家在矩形rectF
中绘制像素图,使用新 边界矩形作为源,因此它变得“更小”。
您应该旋转画家,而不是旋转图像。由于转换默认使用painter的原点(0, 0
),我们需要先平移到矩形的中心,旋转painter,然后再平移回原点。
请注意,在以下示例中,我也总是从源图像开始绘制,而不修改它:连续应用转换将导致由于锯齿而导致的绘图伪影,并且经过一些轮换后,质量会受到很大影响。rotation
变量用于跟踪当前的旋转。
class Window(QWidget):
def __init__(self, *args, **kwargs):
# ...
self.rotation = 0
def rotate_item(self):
self.rotation = (self.rotation + 36) % 360
rectF = QRectF(0,0,556,556)
pix = QPixmap(556,556)
painter = QPainter(pix)
painter.translate(rectF.center())
painter.rotate(self.rotation)
painter.translate(-rectF.center())
painter.drawPixmap(0, 0, self.arch1)
painter.end()
self.label.setPixmap(pix)
【讨论】:
以上是关于PyQt5 旋转像素图的主要内容,如果未能解决你的问题,请参考以下文章
在 python 中使用 pyqt5 旋转或调整轴刻度的大小
PyQt5 - 在表格小部件的列中创建一个检查项,即使行数与旋转框不同