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%

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 667 Views
  • 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.
  • Christian EhrlicherC Online
    Christian EhrlicherC Online
    Christian Ehrlicher
    Lifetime Qt Champion
    wrote on last edited by
    #4

    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.

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

    W 1 Reply Last reply
    2
    • 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 Online
        Christian EhrlicherC Online
        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 Online
            Christian EhrlicherC Online
            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 Online
                Christian EhrlicherC Online
                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 Online
                      Christian EhrlicherC Online
                      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 Online
                          Christian EhrlicherC Online
                          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 Online
                              Christian EhrlicherC Online
                              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