Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. Visual Basic
  4. Out of memory exception - graphics

Out of memory exception - graphics

Scheduled Pinned Locked Moved Visual Basic
graphicsperformancehelpquestion
19 Posts 4 Posters 1 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.
  • T TheComputerMan

    Luc, my apologies but I think I did not get what you were saying, and I did not see them as ideas merely harsh criticism.

    L Offline
    L Offline
    Luc Pattyn
    wrote on last edited by
    #10

    Sorry, no harsh criticism intended; however I get upset when exceptions get ignored like that. They exist to signal a problem, so don't shut them out. One more idea: Image.FromFile throws an OOM on a bad file, so I suggest you check which file fails; then try the sequence again, skipping the first half of the succeeding files. :)

    Luc Pattyn


    Have a look at my entry for the lean-and-mean competition; please provide comments, feedback, discussion, and don’t forget to vote for it! Thank you.


    Local announcement (Antwerp region): Lange Wapper? Neen!


    T 1 Reply Last reply
    0
    • I Ian Shlasko

      No problems on the surface, but maybe a memory leak internally... Graphics calls tend to have issues like that... Basically it wants a delegate of a particular type, in this case a Image.GetThumbnailImageAbort delegate. As per MSDN, you need to create a dummy function, such as:

      Private Function ThumbnailDummyFunc() as Boolean
      End Function

      'And in the GetThumbnailImage call, you would pass this as the argument:
      new Image.GetThumbnailImageAbort(AddressOf ThumbnailDummyFunc)

      (Sorry if my syntax is off... Been programming in C# all day, so it's tricky to switch mental modes)

      Proud to have finally moved to the A-Ark. Which one are you in? Developer, Author (Guardians of Xen)

      T Offline
      T Offline
      TheComputerMan
      wrote on last edited by
      #11

      Hi Ian, I think I sussed out the delegate thing. I ended up with this:

      Dim callback As New Image.GetThumbnailImageAbort(AddressOf ThumbnailCallback)

      and

      Public Function ThumbnailCallback() As Boolean
          Return False
      End Function
      

      so my getthumbnailimage call looks like this now - but the error still occurs.

      destBitmap = sourceBitmap.GetThumbnailImage(imgWidth, imgHeight, callback, IntPtr.Zero)

      Looking at the list of errors there is one 'out of memory', then two 'Parameter is not valid' and then the rest are 'Out of Memory'. I don't know where this 'Parameter is not valid' is coming from so I shall try and single step the whole thing (after the first error)

      T 1 Reply Last reply
      0
      • T TheComputerMan

        Hi Ian, I think I sussed out the delegate thing. I ended up with this:

        Dim callback As New Image.GetThumbnailImageAbort(AddressOf ThumbnailCallback)

        and

        Public Function ThumbnailCallback() As Boolean
            Return False
        End Function
        

        so my getthumbnailimage call looks like this now - but the error still occurs.

        destBitmap = sourceBitmap.GetThumbnailImage(imgWidth, imgHeight, callback, IntPtr.Zero)

        Looking at the list of errors there is one 'out of memory', then two 'Parameter is not valid' and then the rest are 'Out of Memory'. I don't know where this 'Parameter is not valid' is coming from so I shall try and single step the whole thing (after the first error)

        T Offline
        T Offline
        TheComputerMan
        wrote on last edited by
        #12

        It is this line sourceBitmap = New Bitmap(Image.FromFile(ImagePathName)) This causes the Out Of Memory errors and the Parameter is not valid. When I get the parameter error, the file name is a valid existing file name and is a graphic. If I wait two minutes and then complete the list it works, in other words the file that seemed to cause an error, and all the subsequent files in the list, go through OK. :confused: :confused:

        L 1 Reply Last reply
        0
        • L Luc Pattyn

          Sorry, no harsh criticism intended; however I get upset when exceptions get ignored like that. They exist to signal a problem, so don't shut them out. One more idea: Image.FromFile throws an OOM on a bad file, so I suggest you check which file fails; then try the sequence again, skipping the first half of the succeeding files. :)

          Luc Pattyn


          Have a look at my entry for the lean-and-mean competition; please provide comments, feedback, discussion, and don’t forget to vote for it! Thank you.


          Local announcement (Antwerp region): Lange Wapper? Neen!


          T Offline
          T Offline
          TheComputerMan
          wrote on last edited by
          #13

          Thanks Luc, you may have a good point there. I will skip the first files and see if I get the error.

          T 1 Reply Last reply
          0
          • T TheComputerMan

            Thanks Luc, you may have a good point there. I will skip the first files and see if I get the error.

            T Offline
            T Offline
            TheComputerMan
            wrote on last edited by
            #14

            Nope, it went straight through and did the lot (40+ files) no problem. It definitely seems to stil at 66 files.

            T 1 Reply Last reply
            0
            • T TheComputerMan

              Nope, it went straight through and did the lot (40+ files) no problem. It definitely seems to stil at 66 files.

              T Offline
              T Offline
              TheComputerMan
              wrote on last edited by
              #15

              Strange but true Luc, you sort of hit the nail! I did this:

                      sr = New StreamReader(ImagePathName)
                      'sourceBitmap = New Bitmap(Image.FromFile(ImagePathName))
                      sourceBitmap = New Bitmap(Image.FromStream(sr.BaseStream))
              

              Reading it into a stream first works - no memory errors! Thanks for you assistance.(and tutoring :) )

              L 1 Reply Last reply
              0
              • T TheComputerMan

                It is this line sourceBitmap = New Bitmap(Image.FromFile(ImagePathName)) This causes the Out Of Memory errors and the Parameter is not valid. When I get the parameter error, the file name is a valid existing file name and is a graphic. If I wait two minutes and then complete the list it works, in other words the file that seemed to cause an error, and all the subsequent files in the list, go through OK. :confused: :confused:

                L Offline
                L Offline
                Luc Pattyn
                wrote on last edited by
                #16

                TheComputerMan wrote:

                sourceBitmap = New Bitmap(Image.FromFile(ImagePathName))

                that is bad code! Image has a Dispose() method, so you should call it; by having two operations in one line, you don't have the first image reference and can't call Dispose. Split it into two statements, and dispose. BTW: If the copy is there to avoid file lock problems, the cheaper solution is to use Image.FromStream, like so (using C# syntax):

                stream=File.OpenRead(ImagePathName));
                Bitmap bm=Image.FromStream(stream);
                stream.Dispose();

                :)

                Luc Pattyn


                Have a look at my entry for the lean-and-mean competition; please provide comments, feedback, discussion, and don’t forget to vote for it! Thank you.


                Local announcement (Antwerp region): Lange Wapper? Neen!


                T 1 Reply Last reply
                0
                • I Ian Shlasko

                  No problems on the surface, but maybe a memory leak internally... Graphics calls tend to have issues like that... Basically it wants a delegate of a particular type, in this case a Image.GetThumbnailImageAbort delegate. As per MSDN, you need to create a dummy function, such as:

                  Private Function ThumbnailDummyFunc() as Boolean
                  End Function

                  'And in the GetThumbnailImage call, you would pass this as the argument:
                  new Image.GetThumbnailImageAbort(AddressOf ThumbnailDummyFunc)

                  (Sorry if my syntax is off... Been programming in C# all day, so it's tricky to switch mental modes)

                  Proud to have finally moved to the A-Ark. Which one are you in? Developer, Author (Guardians of Xen)

                  T Offline
                  T Offline
                  TheComputerMan
                  wrote on last edited by
                  #17

                  Hi Ian, thanks for your assistance. I resolved it!!!! :) :-D See my reply to Luc

                  1 Reply Last reply
                  0
                  • L Luc Pattyn

                    TheComputerMan wrote:

                    sourceBitmap = New Bitmap(Image.FromFile(ImagePathName))

                    that is bad code! Image has a Dispose() method, so you should call it; by having two operations in one line, you don't have the first image reference and can't call Dispose. Split it into two statements, and dispose. BTW: If the copy is there to avoid file lock problems, the cheaper solution is to use Image.FromStream, like so (using C# syntax):

                    stream=File.OpenRead(ImagePathName));
                    Bitmap bm=Image.FromStream(stream);
                    stream.Dispose();

                    :)

                    Luc Pattyn


                    Have a look at my entry for the lean-and-mean competition; please provide comments, feedback, discussion, and don’t forget to vote for it! Thank you.


                    Local announcement (Antwerp region): Lange Wapper? Neen!


                    T Offline
                    T Offline
                    TheComputerMan
                    wrote on last edited by
                    #18

                    Hi Luc, yes the stream thingy sorted it. I replied this to you on the other bit of the thread. Thanks for all your help.

                    1 Reply Last reply
                    0
                    • T TheComputerMan

                      Strange but true Luc, you sort of hit the nail! I did this:

                              sr = New StreamReader(ImagePathName)
                              'sourceBitmap = New Bitmap(Image.FromFile(ImagePathName))
                              sourceBitmap = New Bitmap(Image.FromStream(sr.BaseStream))
                      

                      Reading it into a stream first works - no memory errors! Thanks for you assistance.(and tutoring :) )

                      L Offline
                      L Offline
                      Luc Pattyn
                      wrote on last edited by
                      #19

                      you're welcome. sorry, having information in two threads got me confused. It still is too expensive; I don't see why you copy the image, as sourceBitmap = New Bitmap(Image.FromStream(sr.BaseStream)) creates two identical images, the first one is the result of FromStream and is a real Image (and also a Bitmap upcast to an Image), the second the result of your Bitmap constructor is a real Bitmap. And once more, the first never gets disposed of. A simple Image.FromStream(sr.BaseStream) As Bitmap should do (or whatever the VB syntax is for casting from Image to Bitmap). This should halve your CPU and memory load. FYI: the person you reply to normally gets an e-mail notification; as you seem to be replying a lot to yourself, you got lots of e-mails, and I only saw your replies by watching the forum. So I suggest you make sure you reply to (the last message of) the person you want to get the reply and notification... :)

                      Luc Pattyn


                      Have a look at my entry for the lean-and-mean competition; please provide comments, feedback, discussion, and don’t forget to vote for it! Thank you.


                      Local announcement (Antwerp region): Lange Wapper? Neen!


                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups