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.2k 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.
  • jsulmJ jsulm

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

    I wonder why the process will crash without error code.

    Did you use debugger to see where exactly it is crashing?
    You should also check https://doc.qt.io/qt-5/qpixmap.html#isNull and https://doc.qt.io/qt-5/qimage.html#isNull before using the QImage/QPixmap.

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

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

                                          • Login

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