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.5k 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

    @jsulm I used debugger, it will process to qimage = qimage.copy() this command,then just crash without any error code.And I try to use qimage.isNull() it return False.

    J.HilkJ Online
    J.HilkJ Online
    J.Hilk
    Moderators
    wrote on last edited by
    #4

    @darrenleeleelee1 out of curiosity, does it also crash, if you try to not copy it into itself but a different variable?


    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 out of curiosity, does it also crash, if you try to not copy it into itself but a different variable?

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

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

      curiosity

      Yes,it also crash.

      jsulmJ 1 Reply Last reply
      0
      • 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 Online
                      J.HilkJ Online
                      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

                                          • Login

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