[Erp5-report] r28974 - in /erp5/trunk/products/PortalTransforms: ./ libtransforms/ tests/ t...

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Sep 11 16:26:56 CEST 2009


Author: kazuhiko
Date: Fri Sep 11 16:26:55 2009
New Revision: 28974

URL: http://svn.erp5.org?rev=28974&view=rev
Log:
Use ImageMagick's 'convert' program instead of PIL to handle CMYK images well.

Added:
    erp5/trunk/products/PortalTransforms/libtransforms/imagemagick_transform.py
    erp5/trunk/products/PortalTransforms/tests/testImageMagickPortalTransforms.py
Modified:
    erp5/trunk/products/PortalTransforms/HISTORY.txt
    erp5/trunk/products/PortalTransforms/transforms/image_to_bmp.py
    erp5/trunk/products/PortalTransforms/transforms/image_to_gif.py
    erp5/trunk/products/PortalTransforms/transforms/image_to_jpeg.py
    erp5/trunk/products/PortalTransforms/transforms/image_to_pcx.py
    erp5/trunk/products/PortalTransforms/transforms/image_to_png.py
    erp5/trunk/products/PortalTransforms/transforms/image_to_ppm.py
    erp5/trunk/products/PortalTransforms/transforms/image_to_tiff.py

Modified: erp5/trunk/products/PortalTransforms/HISTORY.txt
URL: http://svn.erp5.org/erp5/trunk/products/PortalTransforms/HISTORY.txt?rev=28974&r1=28973&r2=28974&view=diff
==============================================================================
--- erp5/trunk/products/PortalTransforms/HISTORY.txt [utf8] (original)
+++ erp5/trunk/products/PortalTransforms/HISTORY.txt [utf8] Fri Sep 11 16:26:55 2009
@@ -1,3 +1,9 @@
+1.4.2-nexedi
+=========================
+
+  * Use ImageMagick's 'convert' program instead of PIL to handle CMYK
+    images well.
+
 1.4.1-nexedi - 2009-03-03
 =========================
 

Added: erp5/trunk/products/PortalTransforms/libtransforms/imagemagick_transform.py
URL: http://svn.erp5.org/erp5/trunk/products/PortalTransforms/libtransforms/imagemagick_transform.py?rev=28974&view=auto
==============================================================================
--- erp5/trunk/products/PortalTransforms/libtransforms/imagemagick_transform.py (added)
+++ erp5/trunk/products/PortalTransforms/libtransforms/imagemagick_transform.py [utf8] Fri Sep 11 16:26:55 2009
@@ -1,0 +1,47 @@
+from Products.PortalTransforms.interfaces import itransform
+import subprocess
+
+class ImageMagickTransforms:
+    __implements__ = itransform
+    __name__  = "imagemagick_transforms"
+    def __init__(self, name=None):
+         if name is not None:
+            self.__name__ = name
+
+    def name(self):
+        return self.__name__
+
+    def convert(self, orig, data, **kwargs):
+        parameter_list = ['convert']
+        newwidth = kwargs.get('width','')
+        newheight = kwargs.get('height','')
+        if newwidth and newheight:
+            parameter_list.extend('-resize', '%sx%s!' % (newwidth, newheight))
+        elif newwidth or newheight:
+            parameter_list.extend('-resize', '%sx%s' % (newwidth, newheight))
+        parameter_list.append('-')
+        parameter_list.append('%s:-' % self.format)
+        process = subprocess.Popen(parameter_list,
+                                   stdin=subprocess.PIPE,
+                                   stdout=subprocess.PIPE,
+                                   stderr=subprocess.PIPE,
+                                   close_fds=True)
+        imgin, imgout, err = process.stdin, process.stdout, process.stderr
+
+        def writeData(stream, data):
+          if isinstance(data, str):
+            stream.write(data)
+          else:
+            # Use PData structure to prevent
+            # consuming too much memory
+            while data is not None:
+              stream.write(data.data)
+              data = data.next
+
+        writeData(imgin, orig)
+        imgin.close()
+        data.setData(imgout.read())
+        return data
+
+def register():
+    return ImageMagickTransforms()

Added: erp5/trunk/products/PortalTransforms/tests/testImageMagickPortalTransforms.py
URL: http://svn.erp5.org/erp5/trunk/products/PortalTransforms/tests/testImageMagickPortalTransforms.py?rev=28974&view=auto
==============================================================================
--- erp5/trunk/products/PortalTransforms/tests/testImageMagickPortalTransforms.py (added)
+++ erp5/trunk/products/PortalTransforms/tests/testImageMagickPortalTransforms.py [utf8] Fri Sep 11 16:26:55 2009
@@ -1,0 +1,86 @@
+import os
+
+from Testing import ZopeTestCase
+from Products.PortalTransforms.tests.utils import input_file_path, normalize_html,\
+     matching_inputs
+from Products.PortalTransforms.transforms.image_to_gif import image_to_gif
+from Products.PortalTransforms.transforms.image_to_png import image_to_png
+from Products.PortalTransforms.transforms.image_to_jpeg import image_to_jpeg
+from Products.PortalTransforms.transforms.image_to_bmp import image_to_bmp
+from Products.PortalTransforms.transforms.image_to_tiff import image_to_tiff
+from Products.PortalTransforms.transforms.image_to_ppm  import image_to_ppm
+from Products.PortalTransforms.transforms.image_to_pcx  import image_to_pcx
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+
+# we have to set locale because lynx output is locale sensitive !
+os.environ['LC_ALL'] = 'C'
+
+class ImageMagickTransformsTest(ERP5TypeTestCase, ZopeTestCase.Functional):
+    def afterSetUp(self):
+        ERP5TypeTestCase.afterSetUp(self)
+        self.pt = self.portal.portal_transforms
+
+    def test_image_to_bmp(self):
+        self.pt.registerTransform(image_to_bmp())
+        imgFile = open(input_file_path('logo.jpg'), 'rb')
+        data = imgFile.read()
+        self.failUnlessEqual(self.portal.mimetypes_registry.classify(data),'image/jpeg')
+        data = self.pt.convertTo(target_mimetype='image/x-ms-bmp',orig=data)
+        self.failUnlessEqual(data.getMetadata()['mimetype'], 'image/x-ms-bmp')
+
+    def test_image_to_gif(self):
+        self.pt.registerTransform(image_to_gif())
+        imgFile = open(input_file_path('logo.png'), 'rb')
+        data = imgFile.read()
+        self.failUnlessEqual(self.portal.mimetypes_registry.classify(data),'image/png')
+        data = self.pt.convertTo(target_mimetype='image/gif',orig=data)
+        self.failUnlessEqual(data.getMetadata()['mimetype'], 'image/gif')
+
+    def test_image_to_jpeg(self):
+        self.pt.registerTransform(image_to_jpeg())
+        imgFile = open(input_file_path('logo.gif'), 'rb')
+        data = imgFile.read()
+        self.failUnlessEqual(self.portal.mimetypes_registry.classify(data),'image/gif')
+        data = self.pt.convertTo(target_mimetype='image/jpeg',orig=data)
+        self.failUnlessEqual(data.getMetadata()['mimetype'], 'image/jpeg')
+
+    def test_image_to_png(self):
+        self.pt.registerTransform(image_to_png())
+        imgFile = open(input_file_path('logo.jpg'), 'rb')
+        data = imgFile.read()
+        self.failUnlessEqual(self.portal.mimetypes_registry.classify(data),'image/jpeg')
+        data = self.pt.convertTo(target_mimetype='image/png',orig=data)
+        self.failUnlessEqual(data.getMetadata()['mimetype'], 'image/png')
+
+    def test_image_to_pcx(self):
+        self.pt.registerTransform(image_to_pcx())
+        imgFile = open(input_file_path('logo.gif'), 'rb')
+        data = imgFile.read()
+        self.failUnlessEqual(self.portal.mimetypes_registry.classify(data),'image/gif')
+        data = self.pt.convertTo(target_mimetype='image/pcx',orig=data)
+        self.failUnlessEqual(data.getMetadata()['mimetype'], 'image/pcx')
+
+    def test_image_to_ppm(self):
+        self.pt.registerTransform(image_to_ppm())
+        imgFile = open(input_file_path('logo.png'), 'rb')
+        data = imgFile.read()
+        self.failUnlessEqual(self.portal.mimetypes_registry.classify(data),'image/png')
+        data = self.pt.convertTo(target_mimetype='image/x-portable-pixmap',orig=data)
+        self.failUnlessEqual(data.getMetadata()['mimetype'], 'image/x-portable-pixmap')
+
+    def test_image_to_tiff(self):
+        self.pt.registerTransform(image_to_tiff())
+        imgFile = open(input_file_path('logo.jpg'), 'rb')
+        data = imgFile.read()
+        self.failUnlessEqual(self.portal.mimetypes_registry.classify(data),'image/jpeg')
+        data = self.pt.convertTo(target_mimetype='image/tiff',orig=data)
+        self.failUnlessEqual(data.getMetadata()['mimetype'], 'image/tiff')
+
+
+# FIXME missing tests for image_to_html, st
+
+def test_suite():
+    from unittest import TestSuite, makeSuite
+    suite = TestSuite()
+    suite.addTest(makeSuite(ImageMagickTransformsTest))
+    return suite

Modified: erp5/trunk/products/PortalTransforms/transforms/image_to_bmp.py
URL: http://svn.erp5.org/erp5/trunk/products/PortalTransforms/transforms/image_to_bmp.py?rev=28974&r1=28973&r2=28974&view=diff
==============================================================================
--- erp5/trunk/products/PortalTransforms/transforms/image_to_bmp.py [utf8] (original)
+++ erp5/trunk/products/PortalTransforms/transforms/image_to_bmp.py [utf8] Fri Sep 11 16:26:55 2009
@@ -1,6 +1,6 @@
-from Products.PortalTransforms.libtransforms.piltransform import PILTransforms
+from Products.PortalTransforms.libtransforms.imagemagick_transform import ImageMagickTransforms
 
-class image_to_bmp(PILTransforms):
+class image_to_bmp(ImageMagickTransforms):
     __name__  = "image_to_bmp"
     inputs    = ('image/*', )
     output   = 'image/x-ms-bmp'

Modified: erp5/trunk/products/PortalTransforms/transforms/image_to_gif.py
URL: http://svn.erp5.org/erp5/trunk/products/PortalTransforms/transforms/image_to_gif.py?rev=28974&r1=28973&r2=28974&view=diff
==============================================================================
--- erp5/trunk/products/PortalTransforms/transforms/image_to_gif.py [utf8] (original)
+++ erp5/trunk/products/PortalTransforms/transforms/image_to_gif.py [utf8] Fri Sep 11 16:26:55 2009
@@ -1,6 +1,6 @@
-from Products.PortalTransforms.libtransforms.piltransform import PILTransforms
+from Products.PortalTransforms.libtransforms.imagemagick_transform import ImageMagickTransforms
 
-class image_to_gif(PILTransforms):
+class image_to_gif(ImageMagickTransforms):
     __name__  = "image_to_gif"
     inputs    = ('image/*', )
     output   = 'image/gif'

Modified: erp5/trunk/products/PortalTransforms/transforms/image_to_jpeg.py
URL: http://svn.erp5.org/erp5/trunk/products/PortalTransforms/transforms/image_to_jpeg.py?rev=28974&r1=28973&r2=28974&view=diff
==============================================================================
--- erp5/trunk/products/PortalTransforms/transforms/image_to_jpeg.py [utf8] (original)
+++ erp5/trunk/products/PortalTransforms/transforms/image_to_jpeg.py [utf8] Fri Sep 11 16:26:55 2009
@@ -1,6 +1,6 @@
-from Products.PortalTransforms.libtransforms.piltransform import PILTransforms
+from Products.PortalTransforms.libtransforms.imagemagick_transform import ImageMagickTransforms
 
-class image_to_jpeg(PILTransforms):
+class image_to_jpeg(ImageMagickTransforms):
     __name__  = "image_to_jpeg"
     inputs    = ('image/*', )
     output   = 'image/jpeg'

Modified: erp5/trunk/products/PortalTransforms/transforms/image_to_pcx.py
URL: http://svn.erp5.org/erp5/trunk/products/PortalTransforms/transforms/image_to_pcx.py?rev=28974&r1=28973&r2=28974&view=diff
==============================================================================
--- erp5/trunk/products/PortalTransforms/transforms/image_to_pcx.py [utf8] (original)
+++ erp5/trunk/products/PortalTransforms/transforms/image_to_pcx.py [utf8] Fri Sep 11 16:26:55 2009
@@ -1,6 +1,6 @@
-from Products.PortalTransforms.libtransforms.piltransform import PILTransforms
+from Products.PortalTransforms.libtransforms.imagemagick_transform import ImageMagickTransforms
 
-class image_to_pcx(PILTransforms):
+class image_to_pcx(ImageMagickTransforms):
     __name__  = "image_to_pcx"
     inputs    = ('image/*', )
     output   = 'image/pcx'

Modified: erp5/trunk/products/PortalTransforms/transforms/image_to_png.py
URL: http://svn.erp5.org/erp5/trunk/products/PortalTransforms/transforms/image_to_png.py?rev=28974&r1=28973&r2=28974&view=diff
==============================================================================
--- erp5/trunk/products/PortalTransforms/transforms/image_to_png.py [utf8] (original)
+++ erp5/trunk/products/PortalTransforms/transforms/image_to_png.py [utf8] Fri Sep 11 16:26:55 2009
@@ -1,6 +1,6 @@
-from Products.PortalTransforms.libtransforms.piltransform import PILTransforms
+from Products.PortalTransforms.libtransforms.imagemagick_transform import ImageMagickTransforms
 
-class image_to_png(PILTransforms):
+class image_to_png(ImageMagickTransforms):
     __name__  = "image_to_png"
     inputs    = ('image/*', )
     output   = 'image/png'

Modified: erp5/trunk/products/PortalTransforms/transforms/image_to_ppm.py
URL: http://svn.erp5.org/erp5/trunk/products/PortalTransforms/transforms/image_to_ppm.py?rev=28974&r1=28973&r2=28974&view=diff
==============================================================================
--- erp5/trunk/products/PortalTransforms/transforms/image_to_ppm.py [utf8] (original)
+++ erp5/trunk/products/PortalTransforms/transforms/image_to_ppm.py [utf8] Fri Sep 11 16:26:55 2009
@@ -1,6 +1,6 @@
-from Products.PortalTransforms.libtransforms.piltransform import PILTransforms
+from Products.PortalTransforms.libtransforms.imagemagick_transform import ImageMagickTransforms
 
-class image_to_ppm(PILTransforms):
+class image_to_ppm(ImageMagickTransforms):
     __name__  = "image_to_ppm"
     inputs    = ('image/*', )
     output   = 'image/x-portable-pixmap'

Modified: erp5/trunk/products/PortalTransforms/transforms/image_to_tiff.py
URL: http://svn.erp5.org/erp5/trunk/products/PortalTransforms/transforms/image_to_tiff.py?rev=28974&r1=28973&r2=28974&view=diff
==============================================================================
--- erp5/trunk/products/PortalTransforms/transforms/image_to_tiff.py [utf8] (original)
+++ erp5/trunk/products/PortalTransforms/transforms/image_to_tiff.py [utf8] Fri Sep 11 16:26:55 2009
@@ -1,6 +1,6 @@
-from Products.PortalTransforms.libtransforms.piltransform import PILTransforms
+from Products.PortalTransforms.libtransforms.imagemagick_transform import ImageMagickTransforms
 
-class image_to_tiff(PILTransforms):
+class image_to_tiff(ImageMagickTransforms):
     __name__  = "image_to_tiff"
     inputs    = ('image/*', )
     output   = 'image/tiff'




More information about the Erp5-report mailing list