arjunbkool

ImageCrop_Test_Graphics

Feb 21st, 2019
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.56 KB | None | 0 0
  1. import os
  2. import sys
  3.  
  4. from PyQt5 import QtGui
  5. from PyQt5 import QtWidgets
  6. from PyQt5.QtCore import Qt, QEvent, QRectF, pyqtSignal, pyqtSlot, QRect
  7. from PyQt5.QtGui import QPainter, QPen, QBrush, QPixmap, QImage
  8. from PyQt5.QtWidgets import QGraphicsPixmapItem, QGraphicsRectItem, QFrame, QGraphicsView, QLabel
  9. from PyQt5.QtWidgets import QApplication, QGraphicsScene, QMainWindow
  10.  
  11. import Ui_ImageCrop_Test # given here: https://pastebin.com/hgJjVjwy
  12. import Ui_ImageROI_Test # given here: https://pastebin.com/A5CzwwVK
  13.  
  14.  
  15. class ImageCrop(Ui_ImageCrop_Test.Ui_MainWindow, QMainWindow):
  16.     formLife = pyqtSignal(bool)
  17.  
  18.     def __init__(self, parent=None):
  19.         super(ImageCrop, self).__init__()
  20.         self.setupUi(self)
  21.         self.pushButton_1.clicked.connect(self.show_images)
  22.         self.label_ID = 0
  23.         self.img_files = ["Image1.jpg",
  24.                           "Image2.jpg"]
  25.  
  26.         self.form2 = ImageROI(self)
  27.         self.form3 = ImageROI(self)
  28.  
  29.         self.label_1.installEventFilter(self)
  30.         self.label_2.installEventFilter(self)
  31.  
  32.     def show_images(self):
  33.         self.form2 = ImageROI(self)
  34.         self.form3 = ImageROI(self)
  35.         labels = [self.label_1, self.label_2]
  36.         for i, label, filename in zip(range(2), labels, self.img_files):
  37.             image = QImage(filename)
  38.             image = image.convertToFormat(QImage.Format_ARGB8565_Premultiplied)
  39.             pixmap = QPixmap(image)
  40.             w = int(label.width() - 4.0)
  41.             h = int(label.height() - 4.0)
  42.             smaller_pixmap = pixmap.scaled(w, h, Qt.IgnoreAspectRatio, Qt.FastTransformation)
  43.             label.setPixmap(smaller_pixmap)
  44.             label.setScaledContents(True)
  45.  
  46.     def eventFilter(self, source, event):
  47.         labels = [self.label_1, self.label_2]
  48.         forms = [self.form2, self.form3]
  49.         if event.type() == QEvent.MouseButtonDblClick:
  50.             if isinstance(source, QLabel) and source.pixmap() is not None:
  51.                 self.label_ID = labels.index(source)
  52.                 forms[self.label_ID].setImage(self.img_files[self.label_ID])
  53.                 forms[self.label_ID].show()
  54.                 forms[self.label_ID].formLife.connect(self.formRefresh)
  55.         return super(ImageCrop, self).eventFilter(source, event)
  56.  
  57.     @pyqtSlot(bool)
  58.     def formRefresh(self, status):
  59.         if status:
  60.             cropped_folder = "Cropped"
  61.             newpath = os.path.join(cropped_folder, os.path.basename(self.img_files[self.label_ID]))
  62.             self.img_files[self.label_ID] = newpath
  63.             del self.form2
  64.             del self.form3
  65.             self.show_images()
  66.  
  67.  
  68. class ImageROI(Ui_ImageROI_Test.Ui_MainWindow, QMainWindow):
  69.     formLife = pyqtSignal(bool)
  70.  
  71.     def __init__(self, parent=None):
  72.         super(ImageROI, self).__init__()
  73.         self.setupUi(self)
  74.         self.path = None
  75.         self.pixmap = None
  76.  
  77.         self.pushButton_1.clicked.connect(self.click1)
  78.         self.pushButton_2.clicked.connect(self.click2)
  79.  
  80.         # My Scene
  81.         self.scene = QGraphicsScene()
  82.         self.scene.clear()
  83.  
  84.         # My Image
  85.         self.image_item = QGraphicsPixmapItem()
  86.  
  87.         # My ROI
  88.         self.ROI_item = QGraphicsRectItem(self.image_item)
  89.         self.ROI_item.setBrush(QBrush(Qt.NoBrush))
  90.         self.ROI_item.setPen(QPen(Qt.white, 0, Qt.DashDotLine))
  91.  
  92.         # My View
  93.         self.view = Click_QGraphicsView(self.graphicsView)
  94.         self.view.setGeometry(self.geometry().x() + 10, self.geometry().y() + 29,
  95.                               self.geometry().width() - 58, self.geometry().height() - 146)
  96.                            
  97.                                 # This part is a forced correction of my coordinates since my view and window are placed apart
  98.    
  99.         self.crop_ratio_w = 1
  100.         self.crop_ratio_h = 1
  101.  
  102.         self.view.ROI_item = self.ROI_item
  103.         self.view.setScene(self.scene)
  104.  
  105.         # My View attributes
  106.         self.view.setBackgroundRole(QtGui.QPalette.Dark)
  107.         self.view.setAlignment(Qt.AlignCenter)
  108.         self.view.setFrameShape(QFrame.NoFrame)
  109.         self.view.setRenderHint(QPainter.Antialiasing, False)
  110.         self.view.setMouseTracking(True)
  111.  
  112.     def setImage(self, path):
  113.  
  114.         self.path = path
  115.         self.pixmap = QPixmap(path)
  116.  
  117.         self.crop_ratio_w = self.pixmap.width() / self.view.width()
  118.         self.crop_ratio_h = self.pixmap.height() / self.view.height()
  119.  
  120.         smaller_pixmap = self.pixmap.scaled(self.view.width(), self.view.height(),
  121.                                             Qt.IgnoreAspectRatio, Qt.FastTransformation)
  122.         self.image_item.setPixmap(smaller_pixmap)
  123.         self.scene.addItem(self.image_item)
  124.         self.scene.addItem(self.ROI_item)
  125.         self.scene.setSceneRect(0, 0, self.view.width(), self.view.height())
  126.         self.view.setGeometry(0, 0, self.view.width(), self.view.height())
  127.  
  128.         self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
  129.         self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
  130.  
  131.         self.view.setSceneSize()
  132.  
  133.     def click1(self):
  134.         crop_rect = self.view.ROI_item.rect().toRect()
  135.         crop_rect = QRect(crop_rect.x() * self.crop_ratio_w, crop_rect.y() * self.crop_ratio_h,
  136.                           crop_rect.width() * self.crop_ratio_w, crop_rect.height() * self.crop_ratio_h)
  137.         cropped = self.pixmap.copy(crop_rect)
  138.         cropped_folder = "Cropped"
  139.         newpath = os.path.join(cropped_folder, os.path.basename(self.path))
  140.         cropped.save(newpath)
  141.         self.close()
  142.         if os.path.exists(newpath):
  143.             self.formLife.emit(True)
  144.  
  145.     def click2(self):
  146.         self.view.click = False
  147.         self.view.selection = False
  148.         self.close()
  149.  
  150.     def keyPressEvent(self, event):
  151.         if event.key() == Qt.Key_Escape:
  152.             rect = QRectF(0, 0, 0, 0)
  153.             self.ROI_item.setRect(rect)
  154.         event.accept()
  155.  
  156.     def mousePressEvent(self, event):
  157.         rect = QRectF(0, 0, 0, 0)
  158.         self.ROI_item.setRect(rect)
  159.  
  160.     def resizeEvent(self, event):
  161.         self.view.setGeometry(self.geometry().x() + 10, self.geometry().y() + 29,
  162.                               self.geometry().width() - 58, self.geometry().height() - 146)
  163.         self.setImage(self.path)
  164.  
  165.  
  166. class Click_QGraphicsView(QGraphicsView):
  167.     scene_size = (0, 0)
  168.     ROI_item = None
  169.     event_origin = None
  170.     event_pos = None
  171.     selection = False
  172.     click = False
  173.  
  174.     def mousePressEvent(self, event):
  175.         self.click = True
  176.         self.selection = True
  177.  
  178.         if self.selection:
  179.             event_pos = self.mapToScene(event.pos())
  180.             pos = (int(event_pos.x()), int(event_pos.y()))
  181.             if 0 <= pos[0] < self.scene_size[0] and 0 <= pos[1] < self.scene_size[1]:
  182.                 self.event_origin = event_pos
  183.             else:
  184.                 self.event_origin = None
  185.             self.click = True
  186.         else:
  187.             QGraphicsView.mousePressEvent(self, event)
  188.  
  189.     def mouseMoveEvent(self, event):
  190.  
  191.         if self.event and self.click:
  192.             self.selection = True
  193.  
  194.         event_pos = self.mapToScene((event.pos()))
  195.         if self.selection and self.click:
  196.             if self.event_origin:
  197.                 if event_pos.x() < 0:
  198.                     event_pos.setX(0)
  199.                 elif event_pos.x() > self.scene_size[0] - 1:
  200.                     event_pos.setX(self.scene_size[0] - 1)
  201.                 if event_pos.y() < 0:
  202.                     event_pos.setY(0)
  203.                 elif event_pos.y() > self.scene_size[1] - 1:
  204.                     event_pos.setY(self.scene_size[1] - 1)
  205.                 self.ROI_item.setRect(QRectF(self.event_origin, event_pos).normalized())
  206.             else:
  207.                 pass
  208.         else:
  209.             QGraphicsView.mouseMoveEvent(self, event)
  210.  
  211.     def mouseReleaseEvent(self, event):
  212.         if self.selection:
  213.             self.click = False
  214.             if self.event_origin:
  215.                 self.event_origin = None
  216.         else:
  217.             QGraphicsView.mouseReleaseEvent(self, event)
  218.  
  219.     def setSceneSize(self):
  220.         rect = self.scene().sceneRect()
  221.         self.scene_size = (rect.width(), rect.height())
  222.  
  223.  
  224. def catch_exceptions(t, val, tb):
  225.     QtWidgets.QMessageBox.critical(None,
  226.                                    "An exception was raised",
  227.                                    "Exception type: {}".format(t))
  228.     old_hook(t, val, tb)
  229.  
  230.  
  231. old_hook = sys.excepthook
  232. sys.excepthook = catch_exceptions
  233.  
  234.  
  235. def main():
  236.     app = QApplication(sys.argv)
  237.     form1 = ImageCrop()
  238.     form1.show()
  239.     app.exec_()
  240.     del form1
  241.  
  242.  
  243. if __name__ == '__main__': main()
Advertisement
Add Comment
Please, Sign In to add comment