使用label添加图片

  1. pix = QPixmap("./data/xxx.png")
  2. self.label.setPixmap(pix)

graphicsView 空间实现图片放大缩小平移等操作

  1. class IMG_WIN(QtWidgets.QWidget):
  2. def __init__(self,graphicsView):
  3. super().__init__()
  4. self.graphicsView=graphicsView
  5. # self.graphicsView.setStyleSheet("padding: 0px; border: 0px;") # 内边距和边界去除
  6. self.scene = QtWidgets.QGraphicsScene(self)
  7. self.graphicsView.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) # 改变对齐方式
  8. self.graphicsView.setSceneRect(0, 0, self.graphicsView.viewport().width(),
  9. self.graphicsView.height()) # 设置图形场景大小和图形视图大小一致
  10. self.graphicsView.setScene(self.scene)
  11. self.scene.mousePressEvent = self.scene_MousePressEvent # 接管图形场景的鼠标点击事件
  12. # self.scene.mouseReleaseEvent = self.scene_mouseReleaseEvent
  13. self.scene.mouseMoveEvent = self.scene_mouseMoveEvent # 接管图形场景的鼠标移动事件
  14. self.scene.wheelEvent = self.scene_wheelEvent # 接管图形场景的滑轮事件
  15. self.ratio = 1 # 缩放初始比例
  16. self.zoom_step = 0.1 # 缩放步长
  17. self.zoom_max = 2 # 缩放最大值
  18. self.zoom_min = 0.2 # 缩放最小值
  19. self.pixmapItem=None
  20. def addScenes(self,img): # 绘制图形
  21. self.org = img
  22. if self.pixmapItem != None:
  23. originX = self.pixmapItem.x()
  24. originY = self.pixmapItem.y()
  25. else:
  26. originX, originY = 0, 0 # 坐标基点
  27. self.scene.clear() # 清除当前图元
  28. img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # opencv读取的bgr格式图片转换成rgb格式
  29. self.pixmap = QtGui.QPixmap(
  30. QtGui.QImage(img[:], img.shape[1], img.shape[0], img.shape[1] * 3,
  31. QtGui.QImage.Format_RGB888)) # 转化为qlbel格式
  32. self.pixmapItem = self.scene.addPixmap(self.pixmap)
  33. self.pixmapItem.setScale(self.ratio) # 缩放
  34. self.pixmapItem.setPos(originX, originY)
  35. def scene_MousePressEvent(self, event):
  36. if event.button() == QtCore.Qt.LeftButton: # 左键按下
  37. print("鼠标左键单击") # 响应测试语句
  38. print("scenePos: ",event.scenePos())
  39. # 获取图片的原始像素
  40. origin_x = (event.scenePos().x() - self.pixmapItem.x())/self.ratio
  41. origin_y = (event.scenePos().y() - self.pixmapItem.y())/self.ratio
  42. print("originPos: ",origin_x,",",origin_y)
  43. self.preMousePosition = event.scenePos() # 获取鼠标当前位置
  44. # if event.button() == QtCore.Qt.RightButton: # 右键按下
  45. # print("鼠标右键单击") # 响应测试语句
  46. def scene_mouseMoveEvent(self, event):
  47. if event.buttons() == QtCore.Qt.LeftButton:
  48. # print("左键移动") # 响应测试语句
  49. self.MouseMove = event.scenePos() - self.preMousePosition # 鼠标当前位置-先前位置=单次偏移量
  50. self.preMousePosition = event.scenePos() # 更新当前鼠标在窗口上的位置,下次移动用
  51. self.pixmapItem.setPos(self.pixmapItem.pos() + self.MouseMove) # 更新图元位置
  52. # 定义滚轮方法。当鼠标在图元范围之外,以图元中心为缩放原点;当鼠标在图元之中,以鼠标悬停位置为缩放中心
  53. def scene_wheelEvent(self, event):
  54. angle = event.delta() / 8 # 返回QPoint对象,为滚轮转过的数值,单位为1/8度
  55. if angle > 0:
  56. # print("滚轮上滚")
  57. self.ratio += self.zoom_step # 缩放比例自加
  58. if self.ratio > self.zoom_max:
  59. self.ratio = self.zoom_max
  60. else:
  61. w = self.pixmap.size().width() * (self.ratio - self.zoom_step)
  62. h = self.pixmap.size().height() * (self.ratio - self.zoom_step)
  63. x1 = self.pixmapItem.pos().x() # 图元左位置
  64. x2 = self.pixmapItem.pos().x() + w # 图元右位置
  65. y1 = self.pixmapItem.pos().y() # 图元上位置
  66. y2 = self.pixmapItem.pos().y() + h # 图元下位置
  67. if event.scenePos().x() > x1 and event.scenePos().x() < x2 \
  68. and event.scenePos().y() > y1 and event.scenePos().y() < y2: # 判断鼠标悬停位置是否在图元中
  69. # print('在内部')
  70. self.pixmapItem.setScale(self.ratio) # 缩放
  71. a1 = event.scenePos() - self.pixmapItem.pos() # 鼠标与图元左上角的差值
  72. a2=self.ratio/(self.ratio- self.zoom_step)-1 # 对应比例
  73. delta = a1 * a2
  74. self.pixmapItem.setPos(self.pixmapItem.pos() - delta)
  75. # ----------------------------分维度计算偏移量-----------------------------
  76. # delta_x = a1.x()*a2
  77. # delta_y = a1.y()*a2
  78. # self.pixmapItem.setPos(self.pixmapItem.pos().x() - delta_x,
  79. # self.pixmapItem.pos().y() - delta_y) # 图元偏移
  80. # -------------------------------------------------------------------------
  81. else:
  82. # print('在外部') # 以图元中心缩放
  83. self.pixmapItem.setScale(self.ratio) # 缩放
  84. delta_x = (self.pixmap.size().width() * self.zoom_step) / 2 # 图元偏移量
  85. delta_y = (self.pixmap.size().height() * self.zoom_step) / 2
  86. self.pixmapItem.setPos(self.pixmapItem.pos().x() - delta_x,
  87. self.pixmapItem.pos().y() - delta_y) # 图元偏移
  88. else:
  89. # print("滚轮下滚")
  90. self.ratio -= self.zoom_step
  91. if self.ratio < 0.2:
  92. self.ratio = 0.2
  93. else:
  94. w = self.pixmap.size().width() * (self.ratio + self.zoom_step)
  95. h = self.pixmap.size().height() * (self.ratio + self.zoom_step)
  96. x1 = self.pixmapItem.pos().x()
  97. x2 = self.pixmapItem.pos().x() + w
  98. y1 = self.pixmapItem.pos().y()
  99. y2 = self.pixmapItem.pos().y() + h
  100. # print(x1, x2, y1, y2)
  101. if event.scenePos().x() > x1 and event.scenePos().x() < x2 \
  102. and event.scenePos().y() > y1 and event.scenePos().y() < y2:
  103. # print('在内部')
  104. self.pixmapItem.setScale(self.ratio) # 缩放
  105. a1 = event.scenePos() - self.pixmapItem.pos() # 鼠标与图元左上角的差值
  106. a2=self.ratio/(self.ratio+ self.zoom_step)-1 # 对应比例
  107. delta = a1 * a2
  108. self.pixmapItem.setPos(self.pixmapItem.pos() - delta)
  109. # ----------------------------分维度计算偏移量-----------------------------
  110. # delta_x = a1.x()*a2
  111. # delta_y = a1.y()*a2
  112. # self.pixmapItem.setPos(self.pixmapItem.pos().x() - delta_x,
  113. # self.pixmapItem.pos().y() - delta_y) # 图元偏移
  114. # -------------------------------------------------------------------------
  115. else:
  116. # print('在外部')
  117. self.pixmapItem.setScale(self.ratio)
  118. delta_x = (self.pixmap.size().width() * self.zoom_step) / 2
  119. delta_y = (self.pixmap.size().height() * self.zoom_step) / 2
  120. self.pixmapItem.setPos(self.pixmapItem.pos().x() + delta_x, self.pixmapItem.pos().y() + delta_y)
  1. # 继承类
  2. self.graphic=IMG_WIN(self.graphicsView)
  3. # 绑定按钮事件
  4. self.pushButton_2.clicked.connect(self.select_img)
  5. # 事件函数
  6. def select_img(self):
  7. img = cv2.imread("./data/triangle.png")
  8. self.graphic.addScenes(img)

实现点击获取原始像素和graphicsView的像素

在scene_MousePressEvent事件函数中

  1. def scene_MousePressEvent(self, event):
  2. if event.button() == QtCore.Qt.LeftButton: # 左键按下
  3. print("鼠标左键单击") # 响应测试语句
  4. print("scenePos: ",event.scenePos())
  5. # 获取图片的原始像素
  6. origin_x = (event.scenePos().x() - self.pixmapItem.x())/self.ratio
  7. origin_y = (event.scenePos().y() - self.pixmapItem.y())/self.ratio

参考链接:

https://blog.csdn.net/weixin_44821251/article/details/106290132

源文件: