Python 如何裁剪图像并保存?
我在Python 如何裁剪图像并保存?,python,pyqt,pyside,crop,Python,Pyqt,Pyside,Crop,我在QHBoxLayout中打开了一个图像。我需要裁剪打开的图像并保存裁剪后的图像。我怎么能在PySide做到这一点 import sys from PySide import QtGui, QtCore class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self):
QHBoxLayout
中打开了一个图像。我需要裁剪打开的图像并保存裁剪后的图像。我怎么能在PySide做到这一点
import sys
from PySide import QtGui, QtCore
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
hbox = QtGui.QHBoxLayout(self)
pixmap = QtGui.QPixmap("re.png")
lbl = QtGui.QLabel(self)
lbl.setPixmap(pixmap)
self.rect = QtCore.QRect()
hbox.addWidget(lbl)
self.setLayout(hbox)
self.setGeometry(300, 300, 280, 170)
self.setWindowTitle('Open Image')
self.show()
# Tried here to implement Qpen
#self.painter = QtGui.QPainter(self)
#self.painter.setPen(QtGui.QPen(QtCore.Qt.black, 1, QtCore.Qt.SolidLine));
#self.painter.drawRect(self.rect);
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
我会使用QImage的
copy
方法:
im2 = im.copy(self.rect)
im2.save(...)
我建议使用类来选择要裁剪的图像区域。(PySide还实现了与PyQt相同的功能)
首先,实现方法mouseMoveEvent(self,QMouseEvent)
,mouseereleaseevent(self,QMouseEvent)
和mousePressEvent(self,QMouseEvent)
(更多信息请参见QtGui.QRubberBand
类参考)
接下来,获取QtGui.QRubberBand
的最后一个几何图形,以便通过使用裁剪图像
最后,使用从裁剪区域放置几何体来裁剪图像。并通过使用保存图像
榜样
import sys
from PyQt4 import QtGui, QtCore
class QExampleLabel (QtGui.QLabel):
def __init__(self, parentQWidget = None):
super(QExampleLabel, self).__init__(parentQWidget)
self.initUI()
def initUI (self):
self.setPixmap(QtGui.QPixmap('input.png'))
def mousePressEvent (self, eventQMouseEvent):
self.originQPoint = eventQMouseEvent.pos()
self.currentQRubberBand = QtGui.QRubberBand(QtGui.QRubberBand.Rectangle, self)
self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, QtCore.QSize()))
self.currentQRubberBand.show()
def mouseMoveEvent (self, eventQMouseEvent):
self.currentQRubberBand.setGeometry(QtCore.QRect(self.originQPoint, eventQMouseEvent.pos()).normalized())
def mouseReleaseEvent (self, eventQMouseEvent):
self.currentQRubberBand.hide()
currentQRect = self.currentQRubberBand.geometry()
self.currentQRubberBand.deleteLater()
cropQPixmap = self.pixmap().copy(currentQRect)
cropQPixmap.save('output.png')
if __name__ == '__main__':
myQApplication = QtGui.QApplication(sys.argv)
myQExampleLabel = QExampleLabel()
myQExampleLabel.show()
sys.exit(myQApplication.exec_())
在QHBoxLayout中显示croping是否重要?您是否还希望通过QRubberBand指定裁剪区域?否在
QHBoxLayout
中显示裁剪并不重要。我只是想在布局中显示图像,然后进行裁剪和保存。如何使用“QRubberBand”?如果它在原则上并不重要,那么您不需要显示您所显示的任何代码。这将使问题变得更短、更容易理解和更好。但是如果您希望用户选择裁剪区域,那么我建议您使用QRubberBand。我没有找到任何好的例子。但是文档应该已经有帮助了,或者在这里提出了一个问题。这个答案并不能解释它为什么有效,人们如何从中学习?
import sys
from PyQt5 import QtGui, QtCore,QtWidgets
from PyQt5.QtWidgets import QRubberBand, QLabel, QApplication, QWidget
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QRect
class QExampleLabel (QLabel):
def __init__(self, parentQWidget = None):
super(QExampleLabel, self).__init__(parentQWidget)
self.initUI()
def initUI (self):
self.setPixmap(QPixmap('input.png'))
def mousePressEvent (self, eventQMouseEvent):
self.originQPoint = eventQMouseEvent.pos()
self.currentQRubberBand = QRubberBand(QRubberBand.Rectangle, self)
self.currentQRubberBand.setGeometry(QRect(self.originQPoint, QtCore.QSize()))
self.currentQRubberBand.show()
def mouseMoveEvent (self, eventQMouseEvent):
self.currentQRubberBand.setGeometry(QRect(self.originQPoint, eventQMouseEvent.pos()).normalized())
def mouseReleaseEvent (self, eventQMouseEvent):
self.currentQRubberBand.hide()
currentQRect = self.currentQRubberBand.geometry()
self.currentQRubberBand.deleteLater()
cropQPixmap = self.pixmap().copy(currentQRect)
cropQPixmap.save('output.png')
if __name__ == '__main__':
myQApplication = QApplication(sys.argv)
myQExampleLabel = QExampleLabel()
myQExampleLabel.show()
sys.exit(myQApplication.exec_())