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. C#
  4. load a lot of Images to memory

load a lot of Images to memory

Scheduled Pinned Locked Moved C#
graphicsquestiondata-structuresperformancehelp
14 Posts 5 Posters 0 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.
  • N Offline
    N Offline
    nryk
    wrote on last edited by
    #1

    hi i want to load a lot of images to the memory. of course every bitmap in the memory takes about 10 times more then in the file; so (if there is no other way) i'm loading the image as a byte array: private byte[] FileToByteArray (string path) { byte[] bytes = null; using (System.IO.Stream stream = File.OpenRead(path)) { using (System.IO.BinaryReader reader = new BinaryReader(stream)) { bytes = reader.ReadBytes((int)reader.BaseStream.Length); } } return bytes; } and store it into a byte array variable. when i need the image i use: private Image ByteArrayToImage(byte[] byteArrayIn) { if (byteArrayIn == null) return null; MemoryStream ms = new MemoryStream(byteArrayIn); Image returnImage = Image.FromStream(ms); return returnImage; } so far so good, the problem is if the image need to be change i send it to a function and get new bitmap, now i want to save it back to byte array, so if i use: private byte[] ImageToByteArray(System.Drawing.Image imageIn) { if (imageIn == null) return null; MemoryStream ms = new MemoryStream(); imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Png); imageIn.Dispose(); return ms.ToArray(); } i get a byte array that is about 10 times bigger. so how can i get a smaller byte array?

    L N G 3 Replies Last reply
    0
    • N nryk

      hi i want to load a lot of images to the memory. of course every bitmap in the memory takes about 10 times more then in the file; so (if there is no other way) i'm loading the image as a byte array: private byte[] FileToByteArray (string path) { byte[] bytes = null; using (System.IO.Stream stream = File.OpenRead(path)) { using (System.IO.BinaryReader reader = new BinaryReader(stream)) { bytes = reader.ReadBytes((int)reader.BaseStream.Length); } } return bytes; } and store it into a byte array variable. when i need the image i use: private Image ByteArrayToImage(byte[] byteArrayIn) { if (byteArrayIn == null) return null; MemoryStream ms = new MemoryStream(byteArrayIn); Image returnImage = Image.FromStream(ms); return returnImage; } so far so good, the problem is if the image need to be change i send it to a function and get new bitmap, now i want to save it back to byte array, so if i use: private byte[] ImageToByteArray(System.Drawing.Image imageIn) { if (imageIn == null) return null; MemoryStream ms = new MemoryStream(); imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Png); imageIn.Dispose(); return ms.ToArray(); } i get a byte array that is about 10 times bigger. so how can i get a smaller byte array?

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

      Hi, several remarks: 1. Image size (the file or memory footprint) depends on the image format; e.g. ImageFormat.Jpeg would be more economical than ImageFormat.Png due to the compression used. 2. When a class offers a public Dispose() method, you should call it as soon as you are done with the object. MemoryStream is one of those. 3. you must be aware that, the way you do things, causes each image to exist several times in memory, and being copied from one format to another: byte[], MemoryStream, Image 4. are you sure you need byte arrays at all? maybe you could perform image operations on the MemoryStream directly. OTOH you might consider using a Bitmap constructor that builds a Bitmap from an existing array, without copying (see the ones with an IntPtr parameter) 5. assuming your images/streams/arrays each take more than some 80KB, they may all end up in the "huge-object-heap" which does not have compaction; as a result after several operations you may run out of memory although your memory-in-use count may well be below your working set. :)

      Luc Pattyn [Forum Guidelines] [My Articles]


      DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.


      L 1 Reply Last reply
      0
      • L Luc Pattyn

        Hi, several remarks: 1. Image size (the file or memory footprint) depends on the image format; e.g. ImageFormat.Jpeg would be more economical than ImageFormat.Png due to the compression used. 2. When a class offers a public Dispose() method, you should call it as soon as you are done with the object. MemoryStream is one of those. 3. you must be aware that, the way you do things, causes each image to exist several times in memory, and being copied from one format to another: byte[], MemoryStream, Image 4. are you sure you need byte arrays at all? maybe you could perform image operations on the MemoryStream directly. OTOH you might consider using a Bitmap constructor that builds a Bitmap from an existing array, without copying (see the ones with an IntPtr parameter) 5. assuming your images/streams/arrays each take more than some 80KB, they may all end up in the "huge-object-heap" which does not have compaction; as a result after several operations you may run out of memory although your memory-in-use count may well be below your working set. :)

        Luc Pattyn [Forum Guidelines] [My Articles]


        DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.


        L Offline
        L Offline
        Lost User
        wrote on last edited by
        #3

        Luc Pattyn wrote:

        ImageFormat.Jpeg would be more economical than ImageFormat.Png due to the compression used.

        Actually you don't know that for sure, it depends on the images.. what if they're diagrams or pictures of text? The OP didn't say..

        L 1 Reply Last reply
        0
        • L Lost User

          Luc Pattyn wrote:

          ImageFormat.Jpeg would be more economical than ImageFormat.Png due to the compression used.

          Actually you don't know that for sure, it depends on the images.. what if they're diagrams or pictures of text? The OP didn't say..

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

          The OP stated "every bitmap in the memory takes about 10 times more then in the file" so I assume compression has been doing a fine job on his original images and stands a good chance of doing the same on the final images. :)

          Luc Pattyn [Forum Guidelines] [My Articles]


          DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.


          L 1 Reply Last reply
          0
          • L Luc Pattyn

            The OP stated "every bitmap in the memory takes about 10 times more then in the file" so I assume compression has been doing a fine job on his original images and stands a good chance of doing the same on the final images. :)

            Luc Pattyn [Forum Guidelines] [My Articles]


            DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.


            L Offline
            L Offline
            Lost User
            wrote on last edited by
            #5

            Fair enough, but, who knows right? PNGOUT-ed PNGs can be a lot smaller than PNGs compressed by the .NET PNG compressor..

            L 1 Reply Last reply
            0
            • L Lost User

              Fair enough, but, who knows right? PNGOUT-ed PNGs can be a lot smaller than PNGs compressed by the .NET PNG compressor..

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

              given time the OP will tell. :)

              Luc Pattyn [Forum Guidelines] [My Articles]


              DISCLAIMER: this message may have been modified by others; it may no longer reflect what I intended, and may contain bad advice; use at your own risk and with extreme care.


              1 Reply Last reply
              0
              • N nryk

                hi i want to load a lot of images to the memory. of course every bitmap in the memory takes about 10 times more then in the file; so (if there is no other way) i'm loading the image as a byte array: private byte[] FileToByteArray (string path) { byte[] bytes = null; using (System.IO.Stream stream = File.OpenRead(path)) { using (System.IO.BinaryReader reader = new BinaryReader(stream)) { bytes = reader.ReadBytes((int)reader.BaseStream.Length); } } return bytes; } and store it into a byte array variable. when i need the image i use: private Image ByteArrayToImage(byte[] byteArrayIn) { if (byteArrayIn == null) return null; MemoryStream ms = new MemoryStream(byteArrayIn); Image returnImage = Image.FromStream(ms); return returnImage; } so far so good, the problem is if the image need to be change i send it to a function and get new bitmap, now i want to save it back to byte array, so if i use: private byte[] ImageToByteArray(System.Drawing.Image imageIn) { if (imageIn == null) return null; MemoryStream ms = new MemoryStream(); imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Png); imageIn.Dispose(); return ms.ToArray(); } i get a byte array that is about 10 times bigger. so how can i get a smaller byte array?

                N Offline
                N Offline
                nryk
                wrote on last edited by
                #7

                i need the png format because i'm useing the alpha channel. how does other programs do that ? for example powerPoint ? in powerPoint i can put tens of images and the memory grows only with a few mb ?

                D 1 Reply Last reply
                0
                • N nryk

                  hi i want to load a lot of images to the memory. of course every bitmap in the memory takes about 10 times more then in the file; so (if there is no other way) i'm loading the image as a byte array: private byte[] FileToByteArray (string path) { byte[] bytes = null; using (System.IO.Stream stream = File.OpenRead(path)) { using (System.IO.BinaryReader reader = new BinaryReader(stream)) { bytes = reader.ReadBytes((int)reader.BaseStream.Length); } } return bytes; } and store it into a byte array variable. when i need the image i use: private Image ByteArrayToImage(byte[] byteArrayIn) { if (byteArrayIn == null) return null; MemoryStream ms = new MemoryStream(byteArrayIn); Image returnImage = Image.FromStream(ms); return returnImage; } so far so good, the problem is if the image need to be change i send it to a function and get new bitmap, now i want to save it back to byte array, so if i use: private byte[] ImageToByteArray(System.Drawing.Image imageIn) { if (imageIn == null) return null; MemoryStream ms = new MemoryStream(); imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Png); imageIn.Dispose(); return ms.ToArray(); } i get a byte array that is about 10 times bigger. so how can i get a smaller byte array?

                  G Offline
                  G Offline
                  Guffa
                  wrote on last edited by
                  #8

                  nryk wrote:

                  private byte[] FileToByteArray (string path)

                  Just use the File.ReadAllBytes method.

                  nryk wrote:

                  of course every bitmap in the memory takes about 10 times more then in the file

                  nryk wrote:

                  i get a byte array that is about 10 times bigger

                  From that I can deduct that you either managed to change the image into an image that is ten times larger (e.g. three times larger in both x and y axis), or you have changed it into something that the Save method could not compress at all. Could you post example image files somewhere for examination?

                  Despite everything, the person most likely to be fooling you next is yourself.

                  N 1 Reply Last reply
                  0
                  • G Guffa

                    nryk wrote:

                    private byte[] FileToByteArray (string path)

                    Just use the File.ReadAllBytes method.

                    nryk wrote:

                    of course every bitmap in the memory takes about 10 times more then in the file

                    nryk wrote:

                    i get a byte array that is about 10 times bigger

                    From that I can deduct that you either managed to change the image into an image that is ten times larger (e.g. three times larger in both x and y axis), or you have changed it into something that the Save method could not compress at all. Could you post example image files somewhere for examination?

                    Despite everything, the person most likely to be fooling you next is yourself.

                    N Offline
                    N Offline
                    nryk
                    wrote on last edited by
                    #9

                    i managed to see the problem: i'm loading jpg files, but in my app i need it as png file ( because of the alpha channel )so when i save it to the memoryStreem as ImageFormat.Png the png is less compressed,is it possible to compress the png file to something like 0.5 mb - 1 mb like jpg ?

                    L G 2 Replies Last reply
                    0
                    • N nryk

                      i need the png format because i'm useing the alpha channel. how does other programs do that ? for example powerPoint ? in powerPoint i can put tens of images and the memory grows only with a few mb ?

                      D Offline
                      D Offline
                      Dave Kreskowiak
                      wrote on last edited by
                      #10

                      Once you create the Bitmap object, in memory, the image is no longer compressed, but is a full 32-bit render of what the file says it should look like.

                      A guide to posting questions on CodeProject[^]
                      Dave Kreskowiak Microsoft MVP Visual Developer - Visual Basic
                           2006, 2007, 2008

                      1 Reply Last reply
                      0
                      • N nryk

                        i managed to see the problem: i'm loading jpg files, but in my app i need it as png file ( because of the alpha channel )so when i save it to the memoryStreem as ImageFormat.Png the png is less compressed,is it possible to compress the png file to something like 0.5 mb - 1 mb like jpg ?

                        L Offline
                        L Offline
                        Lost User
                        wrote on last edited by
                        #11

                        That's hard when the source is a jpg. The PNG will preserve all the JPG compression artifacts resulting in a much bigger file (compared to what it would have been if the original source had directly been PNG-compressed) which essentially doesn't contain any extra useful information - except possibly for the Alpha channel (if present).

                        1 Reply Last reply
                        0
                        • N nryk

                          i managed to see the problem: i'm loading jpg files, but in my app i need it as png file ( because of the alpha channel )so when i save it to the memoryStreem as ImageFormat.Png the png is less compressed,is it possible to compress the png file to something like 0.5 mb - 1 mb like jpg ?

                          G Offline
                          G Offline
                          Guffa
                          wrote on last edited by
                          #12

                          No, there is no lossy compression for PNG. The high compression rate of JPEG is simply done by throwing away the data that has least visual impact on the result. It would of course be possible to write your own compression algorithm that does that, but it would be very hard to get the same quality - compression ratio as JPEG compression, as the compression used in a PNG is not at all designed for lossy compression. Another alternative that is a bit more promising would be to extract the color data and alpha channel separately, and compress the color data as a regular JPEG image and the alpha data as a grayscale JPEG image.

                          Despite everything, the person most likely to be fooling you next is yourself.

                          N 1 Reply Last reply
                          0
                          • G Guffa

                            No, there is no lossy compression for PNG. The high compression rate of JPEG is simply done by throwing away the data that has least visual impact on the result. It would of course be possible to write your own compression algorithm that does that, but it would be very hard to get the same quality - compression ratio as JPEG compression, as the compression used in a PNG is not at all designed for lossy compression. Another alternative that is a bit more promising would be to extract the color data and alpha channel separately, and compress the color data as a regular JPEG image and the alpha data as a grayscale JPEG image.

                            Despite everything, the person most likely to be fooling you next is yourself.

                            N Offline
                            N Offline
                            nryk
                            wrote on last edited by
                            #13

                            Guffa wrote:

                            Another alternative that is a bit more promising would be to extract the color data and alpha channel separately, and compress the color data as a regular JPEG image and the alpha data as a grayscale JPEG image.

                            and how do i do that ? and how do i combine them together later ? is it with LockBits? and run through every "Pixel" ? is there any other file type like png that have the alpha channel and still remain small size ?

                            G 1 Reply Last reply
                            0
                            • N nryk

                              Guffa wrote:

                              Another alternative that is a bit more promising would be to extract the color data and alpha channel separately, and compress the color data as a regular JPEG image and the alpha data as a grayscale JPEG image.

                              and how do i do that ? and how do i combine them together later ? is it with LockBits? and run through every "Pixel" ? is there any other file type like png that have the alpha channel and still remain small size ?

                              G Offline
                              G Offline
                              Guffa
                              wrote on last edited by
                              #14

                              Yes, you would use LockBits to get access to the pixel data. No, there isn't any image format with alpha channel and the compression ratio of JPEG, at least not supported by the .NET framework.

                              Despite everything, the person most likely to be fooling you next is yourself.

                              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