changeset 0:0a54e5bd2875

initial import of cropresive from https://svn.openplans.org/svn/standalone/cropresize
author k0s <k0scist@gmail.com>
date Thu, 29 Oct 2009 18:28:13 -0400
parents
children 0a2302b6377b
files cropresize/__init__.py setup.py
diffstat 2 files changed, 101 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/cropresize/__init__.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+
+import sys
+from PIL import Image
+
+def crop_resize(image, size, exact_size=False):
+    """
+    Crop out the proportional middle of the image and set to the desired size.
+    If the image is bigger than the sizes passed, this works as expected.
+    If the image is smaller than the sizes passed, then behavior is dictated
+    by the `exact_size` flag.  If the 
+
+    """
+    assert size[0] or size[1]
+
+    size = list(size)
+
+    image_ar = image.size[0]/float(image.size[1])
+    crop = size[0] and size[1]
+    if not size[1]:
+        size[1] = int(image.size[1]*size[0]/float(image.size[0]) )
+    if not size[0]:
+        size[0] = int(image.size[0]*size[1]/float(image.size[1]) )
+    size_ar = size[0]/float(size[1])
+
+    if size[0] > image.size[0]:
+        if size[1] > image.size[1]:
+            if not exact_size:
+                return image
+        else:
+            pass
+            # raise NotImplementedError
+    elif size[1] > image.size[1]:
+        pass
+    
+    if crop:
+        if image_ar > size_ar:
+            # trim the width
+            xoffset = int(0.5*(image.size[0] - size_ar*image.size[1]))
+            image = image.crop((xoffset, 0, image.size[0]-xoffset, image.size[1]))
+        elif image_ar < size_ar:
+            # trim the height
+            yoffset = int(0.5*(image.size[1] - image.size[0]/size_ar))
+            image = image.crop((0, yoffset, image.size[0], image.size[1] - yoffset))
+
+    return image.resize(size, Image.ANTIALIAS)
+
+def main():
+    from optparse import OptionParser
+    parser = OptionParser()
+    parser.add_option('-W', '--width')
+    parser.add_option('-H', '--height')
+    parser.add_option('-e', '--exact-size', dest='exact', action='store_true', default=False)
+    (options, args) = parser.parse_args()
+
+    if not args:
+        parser.print_help()
+        sys.exit()
+
+    width = int(options.width)
+    height = int(options.height)
+
+    for arg in args:
+        image = Image.open(arg)
+        new_image = crop_resize(image, (width, height), options.exact)
+        new_image.show()
+
+if __name__ == '__main__':
+    main()
new file mode 100644
--- /dev/null
+++ b/setup.py
@@ -0,0 +1,32 @@
+from setuptools import setup, find_packages
+import sys, os
+
+version = '0.1.1'
+
+setup(name='cropresize',
+      version=version,
+      description="crop and resize an image without doing the math yourself",
+      long_description="""\
+""",
+      classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
+      keywords='image',
+      author='Jeff Hammel',
+      author_email='jhammel@openplans.org',
+      url='http://pypi.python.org/pypi/cropresize',
+      license='GPL',
+      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=[
+          # -*- Extra requirements: -*-
+        'PIL',
+        ],
+      dependency_links=[
+        "http://dist.repoze.org/PIL-1.1.6.tar.gz",
+        ],
+      entry_points="""
+      # -*- Entry points: -*-
+      [console_scripts]
+      crop-resize = cropresize:main
+      """,
+      )