In this article, we will see how to display only circular/round image from any image with any width and height i.e
In order to do so we have to do the following steps :
1. Load the image
2. Crop image to make it square
3. Mask it and make circle from it using Painter
4. Convert it back to pixmap image
Code :
Below is the original image :
# importing libraries from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *
# function to alter image def mask_image(imgdata, imgtype = 'png' , size = 64 ):
# Load image
image = QImage.fromData(imgdata, imgtype)
# convert image to 32-bit ARGB (adds an alpha
# channel ie transparency factor):
image.convertToFormat(QImage.Format_ARGB32)
# Crop image to a square:
imgsize = min (image.width(), image.height())
rect = QRect(
(image.width() - imgsize) / 2 ,
(image.height() - imgsize) / 2 ,
imgsize,
imgsize,
)
image = image.copy(rect)
# Create the output image with the same dimensions
# and an alpha channel and make it completely transparent:
out_img = QImage(imgsize, imgsize, QImage.Format_ARGB32)
out_img.fill(Qt.transparent)
# Create a texture brush and paint a circle
# with the original image onto the output image:
brush = QBrush(image)
# Paint the output image
painter = QPainter(out_img)
painter.setBrush(brush)
# Don't draw an outline
painter.setPen(Qt.NoPen)
# drawing circle
painter.drawEllipse( 0 , 0 , imgsize, imgsize)
# closing painter event
painter.end()
# Convert the image to a pixmap and rescale it.
pr = QWindow().devicePixelRatio()
pm = QPixmap.fromImage(out_img)
pm.setDevicePixelRatio(pr)
size * = pr
pm = pm.scaled(size, size, Qt.KeepAspectRatio,
Qt.SmoothTransformation)
# return back the pixmap data
return pm
class Window(QWidget):
"""Simple window that shows our masked image and text label."""
def __init__( self ):
super ().__init__()
# setting up the geometry
self .setGeometry( 100 , 100 , 600 , 400 )
# image path
imgpath = "image.png"
# loading image
imgdata = open (imgpath, 'rb' ).read()
# calling the function
pixmap = mask_image(imgdata)
# creating label
self .ilabel = QLabel( self )
# putting image on label
self .ilabel.setPixmap(pixmap)
# moving the label
self .ilabel.move( 240 , 180 )
# another label to put text
self .tlabel = QLabel( 'This is circular image' , self )
self .tlabel.move( 200 , 250 )
# main function if __name__ = = '__main__' :
import sys
from PyQt5.QtWidgets import QApplication
# app created
app = QApplication(sys.argv)
w = Window()
w.show()
# begin the app
sys.exit(app.exec_())
|
Output :