[Checkins] SVN: z3c.image/trunk/src/z3c/image/ use a none persistent image implementation to return from processor

Bernd Dorn bernd.dorn at fhv.at
Thu Aug 31 03:31:45 EDT 2006


Log message for revision 69897:
  use a none persistent image implementation to return from processor

Changed:
  A   z3c.image/trunk/src/z3c/image/image.py
  U   z3c.image/trunk/src/z3c/image/proc/README.txt
  U   z3c.image/trunk/src/z3c/image/proc/adapter.py

-=-
Added: z3c.image/trunk/src/z3c/image/image.py
===================================================================
--- z3c.image/trunk/src/z3c/image/image.py	2006-08-30 21:51:25 UTC (rev 69896)
+++ z3c.image/trunk/src/z3c/image/image.py	2006-08-31 07:31:43 UTC (rev 69897)
@@ -0,0 +1,36 @@
+from zope.app.file import Image
+from zope.app.file.interfaces import IImage
+import os
+import stat
+from zope import interface
+import tempfile
+
+class VImage(object):
+    
+    """a non persistent image implementation"""
+
+    interface.implements(IImage)
+
+    def __init__(self, contentType='', size=(0, 0)):
+        self.data = tempfile.TemporaryFile(prefix='z3c.vimage')
+        self.contentType = contentType
+        self.size = size
+                 
+    def getSize(self):
+        try:
+            return len(self.data)
+        except TypeError:
+            data = self.data
+            if hasattr(data, 'fileno'):
+                return int(os.fstat(data.fileno())[stat.ST_SIZE])
+        pos = self.data.tell()
+        size = len(data.read())
+        data.seek(pos)
+        return size
+
+    def getImageSize(self):
+        return self.size
+
+
+        
+    


Property changes on: z3c.image/trunk/src/z3c/image/image.py
___________________________________________________________________
Name: svn:keywords
   + Id
Name: svn:eol-style
   + native

Modified: z3c.image/trunk/src/z3c/image/proc/README.txt
===================================================================
--- z3c.image/trunk/src/z3c/image/proc/README.txt	2006-08-30 21:51:25 UTC (rev 69896)
+++ z3c.image/trunk/src/z3c/image/proc/README.txt	2006-08-31 07:31:43 UTC (rev 69897)
@@ -26,7 +26,7 @@
 
   >>> res = pimg.process()
   >>> res
-  <zope.app.file.image.Image object at ...>
+  <z3c.image.image.VImage object at ...>
 
   >>> res.getImageSize()
   (118, 103)

Modified: z3c.image/trunk/src/z3c/image/proc/adapter.py
===================================================================
--- z3c.image/trunk/src/z3c/image/proc/adapter.py	2006-08-30 21:51:25 UTC (rev 69896)
+++ z3c.image/trunk/src/z3c/image/proc/adapter.py	2006-08-31 07:31:43 UTC (rev 69897)
@@ -1,6 +1,7 @@
 from zope.interface import implements
 from zope import component
 from zope.app.file import Image
+from z3c.image.image import VImage
 from zope.app.file.interfaces import IFile
 from zope.cachedescriptors.property import readproperty
 from PIL import Image as PILImage
@@ -11,6 +12,8 @@
 
 # see http://mail.python.org/pipermail/image-sig/2003-May/002228.html
 ImageFile.MAXBLOCK = 1024*1024
+import thread
+lock = thread.allocate_lock()
 
 class ProcessableImage(object):
 
@@ -44,15 +47,16 @@
         
     def _toImage(self, pimg, *args,**kw):
         """returns an Image object from the given PIL image"""
-        data = StringIO()
+        img = VImage(contentType=self.context.contentType,
+                     size=pimg.size)
         try:
-            pimg.save(data,self.format,*args,**kw)
+            pimg.save(img.data,self.format,*args,**kw)
         except IOError:
             # retry without optimization
             kw.pop('optimize')
-            pimg.save(data,self.format,*args,**kw)
-        data.seek(0)
-        return Image(data)
+            pimg.save(img.data,self.format,*args,**kw)
+        img.data.seek(0)
+        return img
 
     def rotate(self, degrees):
         self.cmds.append(('rotate',[degrees],{}))
@@ -71,14 +75,15 @@
         
     def process(self,quality=90,optimize=1):
         """processes the command queue and returns the image"""
-
         if not self.cmds:
             return self.context
         pimg = self.getPILImg()
         for name,args,kwords in self.cmds:
             func = getattr(pimg,name)
             pimg = func(*args,**kwords)
-        return self._toImage(pimg, quality=quality,optimize=optimize)
+        img = self._toImage(pimg, quality=quality,optimize=optimize)
+        return img
+                        
 
 
 



More information about the Checkins mailing list