Search code examples
pythonpyqt5qlabelqpixmap

How to zoom a picture implemented with QPixmap on pyqt5


I am trying to zoom in a picture i implemented with QPixmap but nothing works. Here is the way i implemented this. (self.hauteur is a float that represents the height)

self.label.setPixmap(QPixmap(self.image).scaledToHeight(self.hauteur))

I've put my label into a layout in order to put it in a scroll widget then.

self.layout6.addWidget(self.label)

...

self.widget1=QWidget()
    self.widget1.setLayout(self.layout6)
    self.scroll1.setWidget(self.widget1)
    self.tab1.layout.addWidget(self.scroll1,0,1,1,2)

...

self.tab1.setLayout(self.tab1.layout)

How should I do if i want to build a method that zoom in or zoom out the picture in my window by pushing a button ? I've tried to resize the label but it doesn't work.

self.action5=QAction(QIcon("Icon/in"),"Zoom in",self)
    self.action5.triggered.connect(self.zoomin)

...

 def zoomin(self):
    self.hauteur+=100
    self.label.scaledToHeight(self.hauteur)
    self.update()

Solution

  • I would resize original QPixmap and put it again in label

        self.scale *= 2
    
        size = self.pixmap.size()
    
        scaled_pixmap = self.pixmap.scaled(self.scale * size)
    
        self.label.setPixmap(scaled_pixmap)
    

    Minimal working code:

    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    
    class MyApp(QWidget):
    
        def __init__(self, *args):
            super().__init__(*args)
    
            self.layout = QVBoxLayout()
            self.setLayout(self.layout)
    
            self.button_zoom_in = QPushButton('Zoom IN', self)
            self.button_zoom_in.clicked.connect(self.on_zoom_in)
            self.layout.addWidget(self.button_zoom_in)
    
            self.button_zoom_out = QPushButton('Zoom OUT', self) 
            self.button_zoom_out.clicked.connect(self.on_zoom_out)
            self.layout.addWidget(self.button_zoom_out)
    
            self.pixmap = QPixmap('image.jpg')
    
            self.label = QLabel(self)
            self.label.setPixmap(self.pixmap)
            self.layout.addWidget(self.label)
    
            self.scale = 1
    
            self.show()
    
        def on_zoom_in(self, event):
            self.scale *= 2
            self.resize_image()
    
        def on_zoom_out(self, event):
            self.scale /= 2
            self.resize_image()
    
        def resize_image(self):
            size = self.pixmap.size()
    
            scaled_pixmap = self.pixmap.scaled(self.scale * size)
    
            self.label.setPixmap(scaled_pixmap)
    
    # --- main ---
    
    app = QApplication([])
    win = MyApp()
    app.exec()
    

    EDIT: The same using self.height += 100 instead of self.scale *= 2

    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    
    class MyApp(QWidget):
    
        def __init__(self, *args):
            super().__init__(*args)
    
            self.layout = QVBoxLayout()
            self.setLayout(self.layout)
    
            self.button_zoom_in = QPushButton('Zoom IN', self)
            self.button_zoom_in.clicked.connect(self.on_zoom_in)
            self.layout.addWidget(self.button_zoom_in)
    
            self.button_zoom_out = QPushButton('Zoom OUT', self) 
            self.button_zoom_out.clicked.connect(self.on_zoom_out)
            self.layout.addWidget(self.button_zoom_out)
    
            self.pixmap = QPixmap('image.jpg')
            self.height = self.pixmap.height()
    
            self.label = QLabel(self)
            self.label.setPixmap(self.pixmap)
            self.layout.addWidget(self.label)
    
            self.show()
    
        def on_zoom_in(self, event):
            self.height += 100
            self.resize_image()
    
        def on_zoom_out(self, event):
            self.height -= 100
            self.resize_image()
    
        def resize_image(self):
            scaled_pixmap = self.pixmap.scaledToHeight(self.height)
            self.label.setPixmap(scaled_pixmap)
    
    # --- main ---
    
    app = QApplication([])
    win = MyApp()
    app.exec()