Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt for Python
  4. PyQt QImage cna't copy, crash without error code
Forum Updated to NodeBB v4.3 + New Features

PyQt QImage cna't copy, crash without error code

Scheduled Pinned Locked Moved Solved Qt for Python
27 Posts 5 Posters 4.4k 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.
  • D darrenleeleelee1

    I want to show on a QImage and translate to QPixmap, but when I want to manipulate(copy, scaled, or construct by QPixmap) qimage then the process will crash.But If I copy to a small rectangle like(2048, 2048) It was not crash any more.

    This arr is numpy ndarray, shape:(3408, 2235) dtype:uint16, maximum value is 65535 and minimum is 0.

    I wonder why the process will crash without error code.

    How can I fix it?

    from PyQt5 import QtCore, QtGui, QtWidgets
    from pydicom import dcmread
    import numpy as np
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            MainWindow.resize(2048, 2048)
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.photo = QtWidgets.QLabel(self.centralwidget)
            self.photo.setGeometry(QtCore.QRect(0, 0, 2048, 2048))
            self.photo.setText("")
            ds = dcmread('./5F329172_20170623_CR_2_1_1')
            arr = ds.pixel_array
            print("ndarray shape: ", arr.shape, " dtype: ", arr.dtype)
            print("ndarray max: ", np.max(arr), " min: ", np.min(arr))
            qimage = QtGui.QImage(arr, arr.shape[1], arr.shape[0], QtGui.QImage.Format_Grayscale16)
            qimage = qimage.copy()
            # qimage = qimage.copy(QtCore.QRect(0, 0, 2048, 2048)) this will not crash
            pixmap = QtGui.QPixmap.fromImage(qimage)
            self.photo.setPixmap(pixmap)
            self.photo.setScaledContents(True)
            self.photo.setObjectName("photo")
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtWidgets.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
            self.menubar.setObjectName("menubar")
            MainWindow.setMenuBar(self.menubar)
            self.statusbar = QtWidgets.QStatusBar(MainWindow)
            self.statusbar.setObjectName("statusbar")
            MainWindow.setStatusBar(self.statusbar)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
         
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
        MainWindow = QtWidgets.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())
    

    dicom data: 5F329172_20170623_CR_2_1_1

    JonBJ Offline
    JonBJ Offline
    JonB
    wrote on last edited by JonB
    #6

    @darrenleeleelee1 said in PyQt QImage cna't copy, crash without error code:

        qimage = qimage.copy()
        # qimage = qimage.copy(QtCore.QRect(0, 0, 2048, 2048)) this will not crash
    

    So do you want to tell us what qImage.width() & qImage.height() of the image actually are?

    D 1 Reply Last reply
    0
    • D darrenleeleelee1

      @J-Hilk said in PyQt QImage cna't copy, crash without error code:

      curiosity

      Yes,it also crash.

      jsulmJ Offline
      jsulmJ Offline
      jsulm
      Lifetime Qt Champion
      wrote on last edited by
      #7

      @darrenleeleelee1 Did you check whether the image is a null image as I already suggested?

      https://forum.qt.io/topic/113070/qt-code-of-conduct

      JonBJ 1 Reply Last reply
      0
      • jsulmJ jsulm

        @darrenleeleelee1 Did you check whether the image is a null image as I already suggested?

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by
        #8

        @jsulm
        He claims

        And I try to use qimage.isNull() it return False.

        assuming this check is done in the right place.

        jsulmJ 1 Reply Last reply
        2
        • JonBJ JonB

          @jsulm
          He claims

          And I try to use qimage.isNull() it return False.

          assuming this check is done in the right place.

          jsulmJ Offline
          jsulmJ Offline
          jsulm
          Lifetime Qt Champion
          wrote on last edited by
          #9

          @JonB I need to read more carefully sometimes :-)

          https://forum.qt.io/topic/113070/qt-code-of-conduct

          1 Reply Last reply
          1
          • JonBJ JonB

            @darrenleeleelee1 said in PyQt QImage cna't copy, crash without error code:

                qimage = qimage.copy()
                # qimage = qimage.copy(QtCore.QRect(0, 0, 2048, 2048)) this will not crash
            

            So do you want to tell us what qImage.width() & qImage.height() of the image actually are?

            D Offline
            D Offline
            darrenleeleelee1
            wrote on last edited by
            #10

            @JonB 1767f8ea-cdc2-4a02-8f12-b6034f2aac2e-image.png
            and it return 2235 3408
            @J-Hilk I copy to tmp and it still crash.

            JonBJ 1 Reply Last reply
            0
            • D darrenleeleelee1

              @JonB 1767f8ea-cdc2-4a02-8f12-b6034f2aac2e-image.png
              and it return 2235 3408
              @J-Hilk I copy to tmp and it still crash.

              JonBJ Offline
              JonBJ Offline
              JonB
              wrote on last edited by
              #11

              @darrenleeleelee1
              Then OOI how does

              qimage = qimage.copy(QtCore.QRect(0, 0, 2235, 3408))
              

              behave?

              D 1 Reply Last reply
              0
              • JonBJ JonB

                @darrenleeleelee1
                Then OOI how does

                qimage = qimage.copy(QtCore.QRect(0, 0, 2235, 3408))
                

                behave?

                D Offline
                D Offline
                darrenleeleelee1
                wrote on last edited by darrenleeleelee1
                #12

                @JonB It won't crash!But when I change to

                qimage.copy(0, 0, qimage.width(), qimage.height()) 
                

                then it crash.Even I give to other variable first it still not work

                wt = qimage.width()
                ht = qimage.height()
                qimage = qimage.copy(0, 0, wt, ht)
                
                J.HilkJ KroMignonK JonBJ 3 Replies Last reply
                0
                • D darrenleeleelee1

                  @JonB It won't crash!But when I change to

                  qimage.copy(0, 0, qimage.width(), qimage.height()) 
                  

                  then it crash.Even I give to other variable first it still not work

                  wt = qimage.width()
                  ht = qimage.height()
                  qimage = qimage.copy(0, 0, wt, ht)
                  
                  J.HilkJ Offline
                  J.HilkJ Offline
                  J.Hilk
                  Moderators
                  wrote on last edited by
                  #13

                  @darrenleeleelee1 what about
                  qimage = qimage.copy(QtCore.QRect())


                  Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                  Q: What's that?
                  A: It's blue light.
                  Q: What does it do?
                  A: It turns blue.

                  D 1 Reply Last reply
                  0
                  • J.HilkJ J.Hilk

                    @darrenleeleelee1 what about
                    qimage = qimage.copy(QtCore.QRect())

                    D Offline
                    D Offline
                    darrenleeleelee1
                    wrote on last edited by
                    #14

                    @J-Hilk I try it.But also crash.

                    1 Reply Last reply
                    0
                    • D darrenleeleelee1

                      @JonB It won't crash!But when I change to

                      qimage.copy(0, 0, qimage.width(), qimage.height()) 
                      

                      then it crash.Even I give to other variable first it still not work

                      wt = qimage.width()
                      ht = qimage.height()
                      qimage = qimage.copy(0, 0, wt, ht)
                      
                      KroMignonK Offline
                      KroMignonK Offline
                      KroMignon
                      wrote on last edited by KroMignon
                      #15

                      @darrenleeleelee1 said in PyQt QImage cna't copy, crash without error code:

                      qimage.copy(0, 0, qimage.width(), qimage.height())

                      then it crash

                      It looks very strange to me, because when looking for QImage::copy(int x, int y, int w, int h), I found:

                         inline QImage copy(int x, int y, int w, int h) const
                              { return copy(QRect(x, y, w, h)); }
                      
                      

                      What if when you change your code to:

                      qimage = QtGui.QImage(arr, arr.shape[1], arr.shape[0], QtGui.QImage.Format_Grayscale16)
                      qimageCopy = qimage.copy()
                      

                      Does this also crash?

                      It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                      1 Reply Last reply
                      0
                      • D darrenleeleelee1

                        @JonB It won't crash!But when I change to

                        qimage.copy(0, 0, qimage.width(), qimage.height()) 
                        

                        then it crash.Even I give to other variable first it still not work

                        wt = qimage.width()
                        ht = qimage.height()
                        qimage = qimage.copy(0, 0, wt, ht)
                        
                        JonBJ Offline
                        JonBJ Offline
                        JonB
                        wrote on last edited by JonB
                        #16

                        @darrenleeleelee1 said in PyQt QImage cna't copy, crash without error code:

                        @JonB It won't crash!But when I change to
                        qimage.copy(0, 0, qimage.width(), qimage.height())

                        then it crash.Even I give to other variable first it still not work
                        wt = qimage.width()
                        ht = qimage.height()
                        qimage = qimage.copy(0, 0, wt, ht)

                        This all implies that the source qimage you start with is the issue.

                        Start by looking at exactly what your arr = ds.pixel_array holds/returns. The QImage() constructor you use states "it must remain valid". That looks to me like the danger area. I think when you copy a portion of the image Qt takes a copy of its own. But probably not when you copy the whole thing. For example, are you able to do a Python copy() on it so you have your own separate copy, which you then use for the image? And btw, if you have any threading involved anywhere, please say so......

                        D 1 Reply Last reply
                        0
                        • JonBJ JonB

                          @darrenleeleelee1 said in PyQt QImage cna't copy, crash without error code:

                          @JonB It won't crash!But when I change to
                          qimage.copy(0, 0, qimage.width(), qimage.height())

                          then it crash.Even I give to other variable first it still not work
                          wt = qimage.width()
                          ht = qimage.height()
                          qimage = qimage.copy(0, 0, wt, ht)

                          This all implies that the source qimage you start with is the issue.

                          Start by looking at exactly what your arr = ds.pixel_array holds/returns. The QImage() constructor you use states "it must remain valid". That looks to me like the danger area. I think when you copy a portion of the image Qt takes a copy of its own. But probably not when you copy the whole thing. For example, are you able to do a Python copy() on it so you have your own separate copy, which you then use for the image? And btw, if you have any threading involved anywhere, please say so......

                          D Offline
                          D Offline
                          darrenleeleelee1
                          wrote on last edited by
                          #17

                          @JonB Sorry I am not really get what did you mean.And I think I don't have any threading.(I think..)

                          JonBJ 1 Reply Last reply
                          0
                          • D darrenleeleelee1

                            @JonB Sorry I am not really get what did you mean.And I think I don't have any threading.(I think..)

                            JonBJ Offline
                            JonBJ Offline
                            JonB
                            wrote on last edited by JonB
                            #18

                            @darrenleeleelee1
                            I have no idea what is behind your

                                    ds = dcmread('./5F329172_20170623_CR_2_1_1')
                                    arr = ds.pixel_array
                            

                            It's some external library stuff. (And btw I have no idea whether arr.shape[1], arr.shape[0] is the right thing to use. Don't bother to explain, just make sure it's correct for whatever this ds stuff is.)

                            Try this:

                            import copy
                            ...
                                    arr = copy.copy(ds.pixel_array)
                            # or even:
                            #        arr = copy.deepcopy(ds.pixel_array)
                            

                            before you proceed to qimage = QtGui.QImage(arr, ...). Any better, crash-wise?

                            D 1 Reply Last reply
                            0
                            • JonBJ JonB

                              @darrenleeleelee1
                              I have no idea what is behind your

                                      ds = dcmread('./5F329172_20170623_CR_2_1_1')
                                      arr = ds.pixel_array
                              

                              It's some external library stuff. (And btw I have no idea whether arr.shape[1], arr.shape[0] is the right thing to use. Don't bother to explain, just make sure it's correct for whatever this ds stuff is.)

                              Try this:

                              import copy
                              ...
                                      arr = copy.copy(ds.pixel_array)
                              # or even:
                              #        arr = copy.deepcopy(ds.pixel_array)
                              

                              before you proceed to qimage = QtGui.QImage(arr, ...). Any better, crash-wise?

                              D Offline
                              D Offline
                              darrenleeleelee1
                              wrote on last edited by
                              #19

                              @JonB 72c6dea2-3187-4f9b-b755-d7939e474ce1-image.png
                              I add deepcopy,and it also crash. I add some arr attribute for you.
                              ed678234-91b9-475e-b889-0117c72ec04c-image.png

                              KroMignonK 1 Reply Last reply
                              0
                              • D darrenleeleelee1

                                @JonB 72c6dea2-3187-4f9b-b755-d7939e474ce1-image.png
                                I add deepcopy,and it also crash. I add some arr attribute for you.
                                ed678234-91b9-475e-b889-0117c72ec04c-image.png

                                KroMignonK Offline
                                KroMignonK Offline
                                KroMignon
                                wrote on last edited by KroMignon
                                #20

                                @darrenleeleelee1 I think you should change your code to:

                                qimage = QtGui.QImage(arr.data, arr.shape[1], arr.shape[0], QtGui.QImage.Format_Grayscale16)
                                

                                It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                                D 1 Reply Last reply
                                0
                                • KroMignonK KroMignon

                                  @darrenleeleelee1 I think you should change your code to:

                                  qimage = QtGui.QImage(arr.data, arr.shape[1], arr.shape[0], QtGui.QImage.Format_Grayscale16)
                                  
                                  D Offline
                                  D Offline
                                  darrenleeleelee1
                                  wrote on last edited by
                                  #21

                                  @KroMignon I change but still crash...What is the different between arr and arr.data?

                                  KroMignonK 1 Reply Last reply
                                  0
                                  • D darrenleeleelee1

                                    @KroMignon I change but still crash...What is the different between arr and arr.data?

                                    KroMignonK Offline
                                    KroMignonK Offline
                                    KroMignon
                                    wrote on last edited by
                                    #22

                                    @darrenleeleelee1 said in PyQt QImage cna't copy, crash without error code:

                                    What is the different between arr and arr.data?

                                    arr is an instance of numpy.ndarray type, according to your code!
                                    And arr.data is the data buffer according to numpy documentation ==> https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html

                                    I think it would be great if you first explain what you want to do.
                                    Perhaps you should take a look at this python script which converts numpy.ndatarray to QImage and vice versa:
                                    https://kogs-www.informatik.uni-hamburg.de/~meine/software/vigraqt/qimage2ndarray.py

                                    It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                                    D 1 Reply Last reply
                                    2
                                    • KroMignonK KroMignon

                                      @darrenleeleelee1 said in PyQt QImage cna't copy, crash without error code:

                                      What is the different between arr and arr.data?

                                      arr is an instance of numpy.ndarray type, according to your code!
                                      And arr.data is the data buffer according to numpy documentation ==> https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html

                                      I think it would be great if you first explain what you want to do.
                                      Perhaps you should take a look at this python script which converts numpy.ndatarray to QImage and vice versa:
                                      https://kogs-www.informatik.uni-hamburg.de/~meine/software/vigraqt/qimage2ndarray.py

                                      D Offline
                                      D Offline
                                      darrenleeleelee1
                                      wrote on last edited by
                                      #23

                                      @KroMignon I saw this before, but I don't know how to apply to uint16.

                                      KroMignonK 1 Reply Last reply
                                      0
                                      • D darrenleeleelee1

                                        @KroMignon I saw this before, but I don't know how to apply to uint16.

                                        KroMignonK Offline
                                        KroMignonK Offline
                                        KroMignon
                                        wrote on last edited by
                                        #24

                                        @darrenleeleelee1 said in PyQt QImage cna't copy, crash without error code:

                                        I saw this before, but I don't know how to apply to uint16.

                                        Which version of Qt-Libs are you using?
                                        Format_Grayscale16 is only support starting from Qt 5.13 (cf. QImage.Format)

                                        Because of this note from documentation:

                                        Constructs an image with the given width , height and format , that uses an existing memory buffer, data . The width and height must be specified in pixels, data must be 32-bit aligned, and each scanline of data in the image must also be 32-bit aligned.

                                        Perhaps you should specify the number of bytes per line, like this:

                                        qimage = QtGui.QImage(arr.data, arr.shape[1], arr.shape[0], arr.shape[1]*2, QtGui.QImage.Format_Grayscale16)
                                        

                                        It is an old maxim of mine that when you have excluded the impossible, whatever remains, however improbable, must be the truth. (Sherlock Holmes)

                                        D 1 Reply Last reply
                                        0
                                        • KroMignonK KroMignon

                                          @darrenleeleelee1 said in PyQt QImage cna't copy, crash without error code:

                                          I saw this before, but I don't know how to apply to uint16.

                                          Which version of Qt-Libs are you using?
                                          Format_Grayscale16 is only support starting from Qt 5.13 (cf. QImage.Format)

                                          Because of this note from documentation:

                                          Constructs an image with the given width , height and format , that uses an existing memory buffer, data . The width and height must be specified in pixels, data must be 32-bit aligned, and each scanline of data in the image must also be 32-bit aligned.

                                          Perhaps you should specify the number of bytes per line, like this:

                                          qimage = QtGui.QImage(arr.data, arr.shape[1], arr.shape[0], arr.shape[1]*2, QtGui.QImage.Format_Grayscale16)
                                          
                                          D Offline
                                          D Offline
                                          darrenleeleelee1
                                          wrote on last edited by darrenleeleelee1
                                          #25

                                          @KroMignon said in PyQt QImage cna't copy, crash without error code:

                                          arr.shape[1]*2

                                          sorry, I read through the QImage API, but I don;t get why I need to add this.
                                          After I add this it seems can work.

                                          KroMignonK 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