I have a QPainterPath and I want to crop an image which is QPixmap. This code worked for me but I want to use PyQt5 builtin functionality like mask without numpy
# read image as RGB and add alpha (transparency) im = Image.open("frontal_1.jpg").convert("RGBA") # convert to numpy (for convenience) imArray = numpy.asarray(im) # create mask polygon = [(444, 203), (623, 243), (691, 177), (581, 26), (482, 42)] maskIm = Image.new('L', (imArray.shape[1], imArray.shape[0]), 0) ImageDraw.Draw(maskIm).polygon(polygon, outline=1, fill=1) mask = numpy.array(maskIm) ... newIm = Image.fromarray(newImArray, "RGBA") newIm.save("out.png")
Advertisement
Answer
One possible way to replace mask is to use the setClipPath() method of QPainter:
from PyQt5 import QtCore, QtGui if __name__ == '__main__': image = QtGui.QImage('input.png') output = QtGui.QImage(image.size(), QtGui.QImage.Format_ARGB32) output.fill(QtCore.Qt.transparent) painter = QtGui.QPainter(output) points = [(444, 203), (623, 243), (691, 177), (581, 26), (482, 42)] polygon = QtGui.QPolygonF([QtCore.QPointF(*point) for point in points]) path = QtGui.QPainterPath() path.addPolygon(polygon) painter.setClipPath(path) painter.drawImage(QtCore.QPoint(), image) painter.end() output.save('out.png')