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.6k 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.
  • 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 Online
        jsulmJ Online
        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 Online
            jsulmJ Online
            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
                                        • 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

                                          • Login

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