The last time I showed how to copy&paste the clipboard text with Excel.
Today I will show you how to deal with a copied clipboard image.
All you have to do is just like below. Not much different from the text example.
self.clip = QtGui.QApplication.clipboard()
qimg = self.clip.image()
You might wannat convert QImage to Numpy array, but I couldn't find the very nice solution.
I will just save the image and cv2.imread. This might be slow, but I can accept for now.
qimg.save("tmp.png")
img = cv2.imread("tmp.png")
To covert from numpy array to QImage, I referred this article.
https://stackoverflow.com/questions/18676888/how-to-configure-color-when-convert-numpy-array-to-qimage
def convert_array_to_qimg(cv_img):
height, width, bytesPerComponent = cv_img.shape
bytesPerLine = bytesPerComponent * width;
#cv2.cvtColor(cv_img, cv2.CV_BGR2RGB)
return QtGui.QImage(cv_img.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888)
The overall program looks like below.
from PyQt4 import QtGui, QtCore
import sys
import cv2
import numpy as np
def convert_array_to_qimg(cv_img):
"""
this is based on https://stackoverflow.com/questions/18676888/how-to-configure-color-when-convert-numpy-array-to-qimage
"""
height, width, bytesPerComponent = cv_img.shape
bytesPerLine = bytesPerComponent * width;
#cv2.cvtColor(cv_img, cv2.CV_BGR2RGB)
return QtGui.QImage(cv_img.data, width, height, bytesPerLine, QtGui.QImage.Format_RGB888)
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.image_frame = QtGui.QLabel()
fname = r"sample08.png"
img = cv2.imread(fname)
#img = QtGui.QImage(fname)
qimg = convert_array_to_qimg(img)
self.image_frame.setPixmap(QtGui.QPixmap.fromImage(qimg))
self.clip = QtGui.QApplication.clipboard()
self.setCentralWidget(self.image_frame)
self.move(30,30)
def keyPressEvent(self, e):
if (e.modifiers() & QtCore.Qt.ControlModifier):
#selected = self.table.selectedRanges()
if e.key() == QtCore.Qt.Key_V:#past
qimg = self.clip.image()
self.displayImage(qimg)
elif e.key() == QtCore.Qt.Key_C: #copy
pass
def displayImage(self, qimg):
self.image_frame.setPixmap(QtGui.QPixmap.fromImage(qimg))
def main(args):
app = QtGui.QApplication(sys.argv)
form = MainWindow()
form.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main(sys.argv)