[Zope] Resizing an Image with PIL via a Form Upload

Tom Von Lahndorff tom at modscape.com
Thu Feb 22 22:48:54 EST 2007


Thanks for everyone's help. I got it to work, here's the script. It  
creates 4 images, enhances them and adds some properties to the  
largest one.

----------

def makeImages(self, imagefile, newkeywords, newcaption):

     import PIL.Image, ImageEnhance, ImageFilter
     import PIL
     from StringIO import StringIO
     import os.path
     import datetime
     import time

     # create the data in a new PIL Image.
     image=PIL.Image.open(imagefile)
     image=image.convert('RGB')
     image=image.filter(ImageFilter.SHARPEN)
     image=image.resize((640, 480), PIL.Image.ANTIALIAS)
     image2=image.resize((320, 240), PIL.Image.ANTIALIAS)
     image3=image.resize((160, 120), PIL.Image.ANTIALIAS)
     image4=image.resize((80, 60), PIL.Image.ANTIALIAS)

     # get the data in memory.
     newimage_file=StringIO()
     image.save(newimage_file, "JPEG")
     newimage_file.seek(0)
     newimage_file2=StringIO()
     image2.save(newimage_file2, "JPEG")
     newimage_file2.seek(0)
     newimage_file3=StringIO()
     image3.save(newimage_file3, "JPEG")
     newimage_file3.seek(0)
     newimage_file4=StringIO()
     image4.save(newimage_file4, "JPEG")
     newimage_file4.seek(0)

     # create an id for the image
     now = datetime.datetime.now()
     newimageid=now.strftime('%Y%m%d%H%M%S')
     newimage_id=newimageid + '-640.jpg'
     newimage_id2=newimageid + '-320.jpg'
     newimage_id3=newimageid + '-160.jpg'
     newimage_id4=newimageid + '-80.jpg'

     # if there's an old image, delete it
     if newimage_id in self.objectIds():
         self.manage_delObjects([newimage_id])
     if newimage_id2 in self.objectIds():
         self.manage_delObjects([newimage_id2])
     if newimage_id3 in self.objectIds():
         self.manage_delObjects([newimage_id3])
     if newimage_id4 in self.objectIds():
         self.manage_delObjects([newimage_id4])

     # create the Zope image object for the new image
     self.manage_addProduct['OFSP'].manage_addImage(newimage_id,  
newimage_file, '')
     self.manage_addProduct['OFSP'].manage_addImage(newimage_id2,  
newimage_file2, '')
     self.manage_addProduct['OFSP'].manage_addImage(newimage_id3,  
newimage_file3, '')
     self.manage_addProduct['OFSP'].manage_addImage(newimage_id4,  
newimage_file4, '')

     # now find the new zope object so we can modify
     # its properties.
     newimage_image=getattr(self, newimage_id)
     newimage_image.manage_addProperty('keywords', '', 'string')
     newimage_image.manage_addProperty('caption', '', 'string')
     newimage_image.manage_addProperty('imageid', '', 'string')
     newimage_image.manage_changeProperties(keywords=newkeywords,  
caption=newcaption, imageid=newimageid)
     newimage_image2=getattr(self, newimage_id2)
     newimage_image2.manage_addProperty('imagefile2', '', 'string')
     newimage_image3=getattr(self, newimage_id3)
     newimage_image3.manage_addProperty('imagefile3', '', 'string')
     newimage_image4=getattr(self, newimage_id4)
     newimage_image4.manage_addProperty('imagefile4', '', 'string')

----------

On Feb 22, 2007, at 4:11 PM, Andrew Langmead wrote:

> On Feb 22, 2007, at 1:29 PM, Tom Von Lahndorff wrote:
>
>> 8    original_image=getattr(self, original_id)
>> 9    original_file=StringIO(str(original_image.data))
> [and later]
>> AttributeError: DSCF0004.jpg
>
> I think your line numbers are off by one, because I'd think it is  
> the getattr that would be causing the Attribute Error (at most,  
> line "9" could give an attribute error for something called "data".
>
> Zope turns file upload objects into   
> ZPublisher.HTTPRequest.FileUpload instances. and pass them to your  
> method. FileUpload instances have an interface similar to python  
> file objects, you can .read(), .seek(), .close() or do whatever you  
> want to them and might not need to wrap the contents into a  
> StringIO object first. (your trying to fetch the file as an  
> attribute of "self" seems to imply that you think the form data is  
> already uploaded into zope and is an Image object in a folder. It  
> isn't there yet, and won't be unless you store it there.)
>
> I think if you removed lines 8 and 9 (by your numbering) and  
> renamed the second argument to the method to "original_file",  
> things would work as you need:
>
> 1 def makeImages(self, original_file):
> 2
> 3    import PIL.Image
> 4    import PIL
> 5    import os.path
> 6
> ...
>
>>



More information about the Zope mailing list