Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Image gets de-pixalated or distorted (unclear) when we change the desktop display scale to 125%
Forum Updated to NodeBB v4.3 + New Features

Image gets de-pixalated or distorted (unclear) when we change the desktop display scale to 125%

Scheduled Pinned Locked Moved Unsolved General and Desktop
17 Posts 5 Posters 815 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • W Offline
    W Offline
    wasimIM
    wrote on last edited by
    #5

    @Christian-Ehrlicher But why does the same code work for QT 5.14.2 version? This is regressed after QT 5.14.2.

    1 Reply Last reply
    0
    • Christian EhrlicherC Offline
      Christian EhrlicherC Offline
      Christian Ehrlicher
      Lifetime Qt Champion
      wrote on last edited by
      #6

      I don't know but would guess it's because of the lack of proper high-dpi handling in Qt5.

      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
      Visit the Qt Academy at https://academy.qt.io/catalog

      1 Reply Last reply
      0
      • Christian EhrlicherC Christian Ehrlicher

        When you display an image with 1000x1000 on a screen with a dpr=1,25 and a size of 1000x1000 then the image needs 1250pixels so it's scaled up. This is what you're seeing. So you should either create a pixmap with 1250x1250 pixels or use 1000/1.25=800x800 as size.

        W Offline
        W Offline
        wasimIM
        wrote on last edited by
        #7

        @Christian-Ehrlicher I didn't get this completely, I tried creating pixmap with 1250 x 1250. with code as below , but same issue. And 800x800 size of what?

        QPixmap pixmap(1250, 1250);
        if (!pixmap.load("D:/temp/clearImag.jpg")) { // Load the image into QPixmap
            qWarning("Failed to load image");
        }
        
        1 Reply Last reply
        0
        • Christian EhrlicherC Offline
          Christian EhrlicherC Offline
          Christian Ehrlicher
          Lifetime Qt Champion
          wrote on last edited by
          #8

          Since the png or jpeg has a size, this is used when you create a QPixmap from it... I don't understand what you try to achieve here.
          When you display an image with 1000x1000 on a screen with a dpr of 1.25 the resulting size of the image on the screen is 800x800 pixels because 800*1.25=1000

          Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
          Visit the Qt Academy at https://academy.qt.io/catalog

          1 Reply Last reply
          0
          • W Offline
            W Offline
            wasimIM
            wrote on last edited by
            #9

            @Christian-Ehrlicher I just want to display a clear image. It should not be unclear with changing of the scaling.

            1 Reply Last reply
            0
            • Christian EhrlicherC Offline
              Christian EhrlicherC Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by
              #10

              Since a pixel based image can not be scaled without artificacts I don't see any solution.

              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
              Visit the Qt Academy at https://academy.qt.io/catalog

              1 Reply Last reply
              0
              • GrecKoG Offline
                GrecKoG Offline
                GrecKo
                Qt Champions 2018
                wrote on last edited by
                #11

                I would try calling QPixmap/QImage::setDevicePixelRatio with the same device pixel ratio as the underlying QScreen.

                Christian EhrlicherC 1 Reply Last reply
                2
                • I Offline
                  I Offline
                  IgKh
                  wrote on last edited by
                  #12

                  Exactly what @GrecKo said. In Qt 6, there was an overhaul of how HiDPI displays are handled - now Qt consistently works in Device Independent Pixels (DIPs), which are mapped to physical pixels by the paint engine. This means that anything painted with QPainter calls or otherwise through vector operations always correctly scales without the program needing to do anything, this is not the case for things painted from a pixmap. As experienced by OP, the automatic scaling of bitmaps hurts quality - but it is needed as otherwise the image would be too small.

                  The way to get around it is to tell Qt explicitly what is the scaling ratio that the image is intended to be viewed at using the setDevicePixelRatio. If it is identical to the target drawing surfaces' scaling ratio, Qt will not do any automatic scaling of the image.

                  Do note that indeed if the image is 1000X1000 physical pixels, and the scaling ratio is 1.25 for both the image and the widget - it will take 800x800 DIPs. This means that as the scaling ratio grows, the image will be drawn smaller and smaller. At some point you'll need to switch to an extra high quality version of the original image that has more pixel density, and Qt does have support for that. See https://doc.qt.io/qt-6/qpainter.html#drawing-high-resolution-versions-of-pixmaps-and-images

                  1 Reply Last reply
                  1
                  • GrecKoG GrecKo

                    I would try calling QPixmap/QImage::setDevicePixelRatio with the same device pixel ratio as the underlying QScreen.

                    Christian EhrlicherC Offline
                    Christian EhrlicherC Offline
                    Christian Ehrlicher
                    Lifetime Qt Champion
                    wrote on last edited by
                    #13

                    @GrecKo said in Image gets de-pixalated or distorted (unclear) when we change the desktop display scale to 125%:

                    I would try calling QPixmap/QImage::setDevicePixelRatio with the same device pixel ratio as the underlying QScreen.

                    How should this help? When he wants to draw an image with 1000x1000px on a screen with 1000x1000 (and this is what he's doing), there are effectively 1250x1250 pixels needed to draw the image so a scaling will occour. The only way to avoid scaling is, as I already wrote, to paint it with 800x800px.

                    Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                    Visit the Qt Academy at https://academy.qt.io/catalog

                    I GrecKoG 2 Replies Last reply
                    0
                    • Christian EhrlicherC Christian Ehrlicher

                      @GrecKo said in Image gets de-pixalated or distorted (unclear) when we change the desktop display scale to 125%:

                      I would try calling QPixmap/QImage::setDevicePixelRatio with the same device pixel ratio as the underlying QScreen.

                      How should this help? When he wants to draw an image with 1000x1000px on a screen with 1000x1000 (and this is what he's doing), there are effectively 1250x1250 pixels needed to draw the image so a scaling will occour. The only way to avoid scaling is, as I already wrote, to paint it with 800x800px.

                      I Offline
                      I Offline
                      IgKh
                      wrote on last edited by IgKh
                      #14

                      @Christian-Ehrlicher

                      Same difference. It is just that:

                      void Whatever::paintEvent(QPaintEvent* e)
                      {
                          // ...snip...
                          
                          image.setDevicePixelRatio(devicePixelRatio());
                          painter.drawImage(0, 0, image);
                      }
                      

                      Is identical to but often easier to do than:

                      void Whatever::paintEvent(QPaintEvent* e)
                      {
                          // ...snip...
                          
                          painter.drawImage(QRectF(0, 0, image.width() / devicePixelRatio(), image.height() / devicePixelRatio()), image);
                      }
                      

                      Since it can be done once after loading the image, and is an easy way to make sure the image is not scaled. It is true that it makes the image smaller, but it doesn't seem like the OP wanted it to be same size, they just wanted it to not be blurry?

                      Christian EhrlicherC 1 Reply Last reply
                      0
                      • I IgKh

                        @Christian-Ehrlicher

                        Same difference. It is just that:

                        void Whatever::paintEvent(QPaintEvent* e)
                        {
                            // ...snip...
                            
                            image.setDevicePixelRatio(devicePixelRatio());
                            painter.drawImage(0, 0, image);
                        }
                        

                        Is identical to but often easier to do than:

                        void Whatever::paintEvent(QPaintEvent* e)
                        {
                            // ...snip...
                            
                            painter.drawImage(QRectF(0, 0, image.width() / devicePixelRatio(), image.height() / devicePixelRatio()), image);
                        }
                        

                        Since it can be done once after loading the image, and is an easy way to make sure the image is not scaled. It is true that it makes the image smaller, but it doesn't seem like the OP wanted it to be same size, they just wanted it to not be blurry?

                        Christian EhrlicherC Offline
                        Christian EhrlicherC Offline
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on last edited by
                        #15

                        @IgKh said in Image gets de-pixalated or distorted (unclear) when we change the desktop display scale to 125%:

                        ut it doesn't seem like the OP wanted it to be same size, they just wanted it to not be blurry?

                        I don't know, we just get a 'sample application' so ...

                        I am trying to show a pdf inside a QT widget QPainter. The pdf looks just fine when I launch the application.

                        ... we don't know how the pdf is converted to a QImage/QPixmap/whatsoever.
                        I already told them to simply render the pdf image (as I would guess it's done this way e.g. with poppler) in size * dpr instead size but he doesn't care.

                        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                        Visit the Qt Academy at https://academy.qt.io/catalog

                        1 Reply Last reply
                        0
                        • Christian EhrlicherC Christian Ehrlicher

                          @GrecKo said in Image gets de-pixalated or distorted (unclear) when we change the desktop display scale to 125%:

                          I would try calling QPixmap/QImage::setDevicePixelRatio with the same device pixel ratio as the underlying QScreen.

                          How should this help? When he wants to draw an image with 1000x1000px on a screen with 1000x1000 (and this is what he's doing), there are effectively 1250x1250 pixels needed to draw the image so a scaling will occour. The only way to avoid scaling is, as I already wrote, to paint it with 800x800px.

                          GrecKoG Offline
                          GrecKoG Offline
                          GrecKo
                          Qt Champions 2018
                          wrote on last edited by
                          #16

                          @Christian-Ehrlicher said in Image gets de-pixalated or distorted (unclear) when we change the desktop display scale to 125%:

                          The only way to avoid scaling is, as I already wrote, to paint it with 800x800px.

                          That's what setDevicePixelRatio does.

                          Christian EhrlicherC 1 Reply Last reply
                          0
                          • GrecKoG GrecKo

                            @Christian-Ehrlicher said in Image gets de-pixalated or distorted (unclear) when we change the desktop display scale to 125%:

                            The only way to avoid scaling is, as I already wrote, to paint it with 800x800px.

                            That's what setDevicePixelRatio does.

                            Christian EhrlicherC Offline
                            Christian EhrlicherC Offline
                            Christian Ehrlicher
                            Lifetime Qt Champion
                            wrote on last edited by
                            #17

                            @GrecKo said in Image gets de-pixalated or distorted (unclear) when we change the desktop display scale to 125%:

                            That's what setDevicePixelRatio does.

                            Did I said something else?
                            I was (and still am) under the impression that he wants to draw with 1000x1000 ...

                            Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                            Visit the Qt Academy at https://academy.qt.io/catalog

                            1 Reply Last reply
                            0

                            • Login

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • Users
                            • Groups
                            • Search
                            • Get Qt Extensions
                            • Unsolved