Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import sys
- from PyQt5 import QtGui
- from PyQt5 import QtWidgets
- from PyQt5.QtCore import Qt, QEvent, QRectF, pyqtSignal, pyqtSlot, QRect
- from PyQt5.QtGui import QPainter, QPen, QBrush, QPixmap, QImage
- from PyQt5.QtWidgets import QGraphicsPixmapItem, QGraphicsRectItem, QFrame, QGraphicsView, QLabel
- from PyQt5.QtWidgets import QApplication, QGraphicsScene, QMainWindow
- import Ui_ImageCrop_Test # given here: https://pastebin.com/hgJjVjwy
- import Ui_ImageROI_Test # given here: https://pastebin.com/A5CzwwVK
- class ImageCrop(Ui_ImageCrop_Test.Ui_MainWindow, QMainWindow):
- formLife = pyqtSignal(bool)
- def __init__(self, parent=None):
- super(ImageCrop, self).__init__()
- self.setupUi(self)
- self.pushButton_1.clicked.connect(self.show_images)
- self.label_ID = 0
- self.img_files = ["Image1.jpg",
- "Image2.jpg"]
- self.form2 = ImageROI(self)
- self.form3 = ImageROI(self)
- self.label_1.installEventFilter(self)
- self.label_2.installEventFilter(self)
- def show_images(self):
- self.form2 = ImageROI(self)
- self.form3 = ImageROI(self)
- labels = [self.label_1, self.label_2]
- for i, label, filename in zip(range(2), labels, self.img_files):
- image = QImage(filename)
- image = image.convertToFormat(QImage.Format_ARGB8565_Premultiplied)
- pixmap = QPixmap(image)
- w = int(label.width() - 4.0)
- h = int(label.height() - 4.0)
- smaller_pixmap = pixmap.scaled(w, h, Qt.IgnoreAspectRatio, Qt.FastTransformation)
- label.setPixmap(smaller_pixmap)
- label.setScaledContents(True)
- def eventFilter(self, source, event):
- labels = [self.label_1, self.label_2]
- forms = [self.form2, self.form3]
- if event.type() == QEvent.MouseButtonDblClick:
- if isinstance(source, QLabel) and source.pixmap() is not None:
- self.label_ID = labels.index(source)
- forms[self.label_ID].setImage(self.img_files[self.label_ID])
- forms[self.label_ID].show()
- forms[self.label_ID].formLife.connect(self.formRefresh)
- return super(ImageCrop, self).eventFilter(source, event)
- @pyqtSlot(bool)
- def formRefresh(self, status):
- if status:
- cropped_folder = "Cropped"
- newpath = os.path.join(cropped_folder, os.path.basename(self.img_files[self.label_ID]))
- self.img_files[self.label_ID] = newpath
- del self.form2
- del self.form3
- self.show_images()
- class ImageROI(Ui_ImageROI_Test.Ui_MainWindow, QMainWindow):
- formLife = pyqtSignal(bool)
- def __init__(self, parent=None):
- super(ImageROI, self).__init__()
- self.setupUi(self)
- self.path = None
- self.pixmap = None
- self.pushButton_1.clicked.connect(self.click1)
- self.pushButton_2.clicked.connect(self.click2)
- # My Scene
- self.scene = QGraphicsScene()
- self.scene.clear()
- # My Image
- self.image_item = QGraphicsPixmapItem()
- # My ROI
- self.ROI_item = QGraphicsRectItem(self.image_item)
- self.ROI_item.setBrush(QBrush(Qt.NoBrush))
- self.ROI_item.setPen(QPen(Qt.white, 0, Qt.DashDotLine))
- # My View
- self.view = Click_QGraphicsView(self.graphicsView)
- self.view.setGeometry(self.geometry().x() + 10, self.geometry().y() + 29,
- self.geometry().width() - 58, self.geometry().height() - 146)
- # This part is a forced correction of my coordinates since my view and window are placed apart
- self.crop_ratio_w = 1
- self.crop_ratio_h = 1
- self.view.ROI_item = self.ROI_item
- self.view.setScene(self.scene)
- # My View attributes
- self.view.setBackgroundRole(QtGui.QPalette.Dark)
- self.view.setAlignment(Qt.AlignCenter)
- self.view.setFrameShape(QFrame.NoFrame)
- self.view.setRenderHint(QPainter.Antialiasing, False)
- self.view.setMouseTracking(True)
- def setImage(self, path):
- self.path = path
- self.pixmap = QPixmap(path)
- self.crop_ratio_w = self.pixmap.width() / self.view.width()
- self.crop_ratio_h = self.pixmap.height() / self.view.height()
- smaller_pixmap = self.pixmap.scaled(self.view.width(), self.view.height(),
- Qt.IgnoreAspectRatio, Qt.FastTransformation)
- self.image_item.setPixmap(smaller_pixmap)
- self.scene.addItem(self.image_item)
- self.scene.addItem(self.ROI_item)
- self.scene.setSceneRect(0, 0, self.view.width(), self.view.height())
- self.view.setGeometry(0, 0, self.view.width(), self.view.height())
- self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
- self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
- self.view.setSceneSize()
- def click1(self):
- crop_rect = self.view.ROI_item.rect().toRect()
- crop_rect = QRect(crop_rect.x() * self.crop_ratio_w, crop_rect.y() * self.crop_ratio_h,
- crop_rect.width() * self.crop_ratio_w, crop_rect.height() * self.crop_ratio_h)
- cropped = self.pixmap.copy(crop_rect)
- cropped_folder = "Cropped"
- newpath = os.path.join(cropped_folder, os.path.basename(self.path))
- cropped.save(newpath)
- self.close()
- if os.path.exists(newpath):
- self.formLife.emit(True)
- def click2(self):
- self.view.click = False
- self.view.selection = False
- self.close()
- def keyPressEvent(self, event):
- if event.key() == Qt.Key_Escape:
- rect = QRectF(0, 0, 0, 0)
- self.ROI_item.setRect(rect)
- event.accept()
- def mousePressEvent(self, event):
- rect = QRectF(0, 0, 0, 0)
- self.ROI_item.setRect(rect)
- def resizeEvent(self, event):
- self.view.setGeometry(self.geometry().x() + 10, self.geometry().y() + 29,
- self.geometry().width() - 58, self.geometry().height() - 146)
- self.setImage(self.path)
- class Click_QGraphicsView(QGraphicsView):
- scene_size = (0, 0)
- ROI_item = None
- event_origin = None
- event_pos = None
- selection = False
- click = False
- def mousePressEvent(self, event):
- self.click = True
- self.selection = True
- if self.selection:
- event_pos = self.mapToScene(event.pos())
- pos = (int(event_pos.x()), int(event_pos.y()))
- if 0 <= pos[0] < self.scene_size[0] and 0 <= pos[1] < self.scene_size[1]:
- self.event_origin = event_pos
- else:
- self.event_origin = None
- self.click = True
- else:
- QGraphicsView.mousePressEvent(self, event)
- def mouseMoveEvent(self, event):
- if self.event and self.click:
- self.selection = True
- event_pos = self.mapToScene((event.pos()))
- if self.selection and self.click:
- if self.event_origin:
- if event_pos.x() < 0:
- event_pos.setX(0)
- elif event_pos.x() > self.scene_size[0] - 1:
- event_pos.setX(self.scene_size[0] - 1)
- if event_pos.y() < 0:
- event_pos.setY(0)
- elif event_pos.y() > self.scene_size[1] - 1:
- event_pos.setY(self.scene_size[1] - 1)
- self.ROI_item.setRect(QRectF(self.event_origin, event_pos).normalized())
- else:
- pass
- else:
- QGraphicsView.mouseMoveEvent(self, event)
- def mouseReleaseEvent(self, event):
- if self.selection:
- self.click = False
- if self.event_origin:
- self.event_origin = None
- else:
- QGraphicsView.mouseReleaseEvent(self, event)
- def setSceneSize(self):
- rect = self.scene().sceneRect()
- self.scene_size = (rect.width(), rect.height())
- def catch_exceptions(t, val, tb):
- QtWidgets.QMessageBox.critical(None,
- "An exception was raised",
- "Exception type: {}".format(t))
- old_hook(t, val, tb)
- old_hook = sys.excepthook
- sys.excepthook = catch_exceptions
- def main():
- app = QApplication(sys.argv)
- form1 = ImageCrop()
- form1.show()
- app.exec_()
- del form1
- if __name__ == '__main__': main()
Advertisement
Add Comment
Please, Sign In to add comment