manipulaton of image in memeory

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • bharathv6
    New Member
    • Feb 2008
    • 3

    manipulaton of image in memeory

    i need to do is modify the image in memory like resizing the image in memory etc ... with out saving it disk as i have to return back the image with out saving it disk
    PIL supports the use of StringIO objects being passed in place of file
    objects. StringIO objects are binary strings of variable length that are kept
    in memory so i saved the image in stringio objects the following code does that
    file = StringIO()
    image.save(file , "JPEG")
    cached_image = file.getvalue()
    but i can't apply resize operation on cached_image as it a str object
    but i found out that Image.formstrin g(mode, size, data, decoder, parameters) Creates an image memory from pixel data in a string so i did the following

    image=Image.fro mstring('P',(12 8,128),cached_i mage,'gif')

    but the i got following error shown below can any one tell me what was the error .. or tell me an alternative to modify the image in memory with out saving in disk ..

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/usr/lib/python2.5/site-packages/PIL/Image.py", line 1744, in fromstring
    im.fromstring(d ata, decoder_name, args)
    File "/usr/lib/python2.5/site-packages/PIL/Image.py", line 577, in fromstring
    raise ValueError("can not decode image data")
    ValueError: cannot decode image data
  • dshimer
    Recognized Expert New Member
    • Dec 2006
    • 136

    #2
    I'm not sure I totally understand your question, but it looks like you are trying to make it too difficult. It seems to me like PIL modifies everything in memory. For example when playing around with new methods I have the script open an image, do several things to it, then just show it to the screen. When things are finalized, I put in the code to re-write the new image. In the following session, I


    1. import most everything I need because we work with several types of images.
    2. create an open image object.
    3. get the size just to show what it is
    4. rotate (with expansion) it and show it's new size
    5. rotate, resize, then show the new size just to show the progression of what is happening in memory.
    Code:
    >>> import Image,JpegImagePlugin,TiffImagePlugin,PngImagePlugin,BmpImagePlugin>>> im=Image.open('/tmp/test.jpg','r')
    >>> im.size
    (1122, 777)
    >>> im.rotate(45,0,1).size
    (1344, 1343)
    >>> im.rotate(45,0,1).resize(100,100).size
    >>> im.rotate(45,0,1).resize([100,100],3).size
    (100, 100)
    In place of size, I could have used show() if I wanted to see the results visually, or save() if I wanted to write it out after final manipulation. I have programs that use these simple methods to do things like rotating, resizing, compositing, applying level adjustments and so on.


    Using these methods, I haven't had much success manipulating images in the 1Gb range but I'm beginning to think that is more a problem with Windows than with PIL (because I have 2 other programs written by "real programmers "which should work fine that also choke on images over 1 Gb).


    Originally posted by bharathv6
    i need to do is modify the image in memory like resizing the image in memory etc ... with out saving it disk as i have to return back the image with out saving it disk
    PIL supports the use of StringIO objects being passed in place of file
    objects. StringIO objects are binary strings of variable length that are kept
    in memory so i saved the image in stringio objects the following code does that
    file = StringIO()
    image.save(file , "JPEG")
    cached_image = file.getvalue()
    but i can't apply resize operation on cached_image as it a str object
    but i found out that Image.formstrin g(mode, size, data, decoder, parameters) Creates an image memory from pixel data in a string so i did the following

    image=Image.fro mstring('P',(12 8,128),cached_i mage,'gif')

    but the i got following error shown below can any one tell me what was the error .. or tell me an alternative to modify the image in memory with out saving in disk ..

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/usr/lib/python2.5/site-packages/PIL/Image.py", line 1744, in fromstring
    im.fromstring(d ata, decoder_name, args)
    File "/usr/lib/python2.5/site-packages/PIL/Image.py", line 577, in fromstring
    raise ValueError("can not decode image data")
    ValueError: cannot decode image data

    Comment

    • bharathv6
      New Member
      • Feb 2008
      • 3

      #3
      thanks for replying
      let me make it clear to u ... what i need to really do is to implement an image server which gets images from other server and store it cache (not in disk) when i get a request from any clent for a particular image of particular size i need to get the image from the cache resize it and return the image to the client . as the data got from the cache by memcahe is of type str object i cannot do reize operation on it so i need to convert it to a image in memory so that i can do resize operation on it ..
      so i did the following.
      PIL supports the use of StringIO objects being passed in place of file
      objects. StringIO objects are binary strings of variable length that are kept
      in memory so i saved the image in stringio objects the following code does that

      for gif image
      import Image
      import StringIO
      im = Image.open("/home/bharath/Desktop/photos/lena.gif")
      fil=StringIO.St ringIO()
      im.save(fil,"GI F")
      cached_image=fi l.getvalue()

      or

      for jpeg image
      import Image
      import StringIO
      im = Image.open("/home/bharath/Desktop/photos/lena.jpg")
      fil=StringIO.St ringIO()
      im.save(fil,"JP EG")
      cached_image=fi l.getvalue()

      but i can't apply resize operation on cached_image as it a str object
      but i found out that Image.formstrin g(mode, size, data, decoder, parameters) Creates an image memory from pixel data in a string so i did the following
      for gif image
      ima=Image.froms tring('P',(128, 128),cached_ima ge,'gif')
      imr=ima.resize( (64,64),Image.A NTIALIAS)
      imr.save("/home/bharath/Desktop/photos/resize_lena3.gi f","GIF")

      i am getting the following error

      Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/bharath/Desktop/image.py", line 8, in <module>
      ima=Image.froms tring('P',(128, 128),cached_ima ge,'gif')
      File "/usr/lib/python2.5/site-packages/PIL/Image.py", line 1744, in fromstring
      im.fromstring(d ata, decoder_name, args)
      File "/usr/lib/python2.5/site-packages/PIL/Image.py", line 577, in fromstring
      raise ValueError("can not decode image data")
      ValueError: cannot decode image data

      for jpeg image
      ma=Image.fromst ring('P',(128,1 28),cached_imag e,'jpeg')
      imr=ima.resize( (64,64),Image.A NTIALIAS)
      imr.save("/home/bharath/Desktop/photos/resize_lena3.gi f","JPEG")

      i am getting the following error ...

      Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/home/bharath/Desktop/image.py", line 8, in <module>
      ima=Image.froms tring('RGB',(12 8,128),cached_i mage,'jpeg')
      File "/usr/lib/python2.5/site-packages/PIL/Image.py", line 1744, in fromstring
      im.fromstring(d ata, decoder_name, args)
      File "/usr/lib/python2.5/site-packages/PIL/Image.py", line 570, in fromstring
      d = _getdecoder(sel f.mode, decoder_name, args)
      File "/usr/lib/python2.5/site-packages/PIL/Image.py", line 373, in _getdecoder
      return apply(decoder, (mode,) + args + extra)
      TypeError: function takes at least 3 arguments (1 given)

      but if i remove the 4th parameter that is decoder_name i.e 'gif' or 'jpeg' in function Image.formstrin g(mode, size, data, decoder, parameters) there is no error(when decoder_name is not given it defaults to raw image type) .. image even gets resized and gets saved but that image is distorted image that shows that it is not decoded in correct way .. and when i want a image to be decoded according to a format i.e gif or jpeg i think i need to pass a extra parameter in the function Image.fromstrin g(mode, size, data, decoder, parameters) along with a decoder name to be decoded correctly .

      pls can u tell what extra parameters i have to pass with an example (taking my example itself )


      Originally posted by dshimer
      I'm not sure I totally understand your question, but it looks like you are trying to make it too difficult. It seems to me like PIL modifies everything in memory. For example when playing around with new methods I have the script open an image, do several things to it, then just show it to the screen. When things are finalized, I put in the code to re-write the new image. In the following session, I


      1. import most everything I need because we work with several types of images.
      2. create an open image object.
      3. get the size just to show what it is
      4. rotate (with expansion) it and show it's new size
      5. rotate, resize, then show the new size just to show the progression of what is happening in memory.
      Code:
      >>> import Image,JpegImagePlugin,TiffImagePlugin,PngImagePlugin,BmpImagePlugin>>> im=Image.open('/tmp/test.jpg','r')
      >>> im.size
      (1122, 777)
      >>> im.rotate(45,0,1).size
      (1344, 1343)
      >>> im.rotate(45,0,1).resize(100,100).size
      >>> im.rotate(45,0,1).resize([100,100],3).size
      (100, 100)
      In place of size, I could have used show() if I wanted to see the results visually, or save() if I wanted to write it out after final manipulation. I have programs that use these simple methods to do things like rotating, resizing, compositing, applying level adjustments and so on.


      Using these methods, I haven't had much success manipulating images in the 1Gb range but I'm beginning to think that is more a problem with Windows than with PIL (because I have 2 other programs written by "real programmers "which should work fine that also choke on images over 1 Gb).

      Comment

      Working...