Hi, Am Montag, den 27.12.2004, 23:36 -0800 schrieb John Schinnerer:
Hello,
I am developing an art-gallery type of product, with images of artworks stored as zope Image objects within a folderish product instance.
When a new gallery item instance is created, or when the Image object in an existing instance is changed, I want to auto-generate a thumbnail of the image (using PIL) and store it also as a zope Image object.
In manage_addAction for example I have this: ... imgfile = REQUEST.image_file if imgfile and imgfile.filename != '': newObjId.manage_addImage('art_piece', imgfile, newObjId.title) newObjId.manage_addImage('art_piece_thumb', makeThumb(imgfile), newObjId.title) ...
and here is makeThumb (using PIL):
def makeThumb(imagefile): "create thumbnail image from full-size art_piece image" img = Image.open(imagefile) thumb = img.thumbnail((111,111), Image.ANTIALIAS) return thumb
I get a zope error triggered by the line
img = Image.open(imagefile)
like this:
Error Type: AttributeError Error Value: FileUpload instance has no attribute '__getitem__' (traceback further below if helpful)
So apparently there is some problem with trying to use the image file passed in the request with the PIL functions...it's not a "real" file or at least doesn't have some attributes that PIL is expecting to find, or something like that.
Is there a simple way around this the way I'm trying to do it?
Well, the image Object does not get created with a real file everytime. Look at the documentation for Image.open() for this. I use this approach in my Images update_data: def update_data(self,data,content_type=None, size=None): OFS.Image.Image.update_data(self,data, content_type=content_type,size=size) parser=PIL.ImageFile.Parser() d=self.data if d: if type(d)==type(""): parser.feed(d) else: while d: parser.feed(d.data) d=d.next parser.close() if parser.finished: img=parser.image at this point you can use img.thumbnail() to create the miniature