changeset 5:c89738f3f417

* improve command line interface * improve README * bump version
author k0s <k0scist@gmail.com>
date Sat, 06 Mar 2010 14:55:04 -0500
parents 6ec33e2ce60f
children 0cd9a1362310
files README.txt cropresize/__init__.py setup.py
diffstat 3 files changed, 51 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/README.txt
+++ b/README.txt
@@ -1,31 +1,41 @@
 cropresize
 ==========
 
-cropresize uses PIL to crop and resize an image as appropriate for web
+cropresize uses `PIL <http://www.pythonware.com/products/pil/>`_
+to crop and resize an image as appropriate for web
 presentation. cropresize is a convenience package that allows image
 resizing without aspect ratio distortion.
 
 API
 ---
 
 cropresize contains one useful function, ``cropresize.crop_resize``.
 The function takes three arguments:
 
-    * image: a PIL image object
+    * image: a `PIL image <http://www.pythonware.com/library/pil/handbook/image.htm>`_ object
     * size: a 2-tuple of (width,height);  at least one must be specified
     * exact_size: whether to scale up for smaller images  
 
 See ``cropresize.crop_resize.__doc__`` for the function
 documentation.  ``crop_resize`` returns the cropped and resized PIL image.
 
 
 Command Line
 ------------
 
 The command line program, ``crop-resize``, is included in this python
 package.  The help for the program is displayed by running
 ``crop-resize`` with no arguments or ``crop-resize --help``.
 
+
+Future Work
+-----------
+
+cropresize is written as a convenience function to PIL as this
+methodology for cropping and resizing images is often desired for
+presentation, particularly on the web.  Since the utility is in
+demand, the functionality should be ported upstream to PIL.
+
 --
 
 http://k0s.org/portfolio/software.html#cropresize
--- a/cropresize/__init__.py
+++ b/cropresize/__init__.py
@@ -10,17 +10,17 @@ def crop_resize(image, size, exact_size=
     * size: a 2-tuple of (width,height);  at least one must be specified
     * exact_size: whether to scale up for smaller images
     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 ``exact_size`` flag is false,
     the image will be returned unmodified.  If the ``exact_size`` flag is true,
     the image will be scaled up to the required size.
     """
-    assert size[0] or size[1]
+    assert size[0] or size[1], "Must provide a width or a height"
 
     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]:
@@ -47,27 +47,58 @@ def crop_resize(image, size, exact_size=
             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('%prog [options] image1.png [image2.jpg] [...]')
-    parser.add_option('-W', '--width')
-    parser.add_option('-H', '--height')
-    parser.add_option('-e', '--exact-size', dest='exact', action='store_true', default=False)
+    parser.add_option('-W', '--width',
+                      help="desired width of image in pixels")
+    parser.add_option('-H', '--height',
+                      help="desired height of image in pixels")
+    parser.add_option('-e', '--exact-size', dest='exact',
+                      action='store_true', default=False,
+                      help="scale up images smaller than specified")
+    parser.add_option('-d', '--display', dest='display',
+                      action='store_true', default=False,
+                      help="display the resized images (don't write to file)")
+    parser.add_option('-O', '--file', dest='output',
+                      help="output to a file, stdout otherwise [1 image only]")
     (options, args) = parser.parse_args()
 
+    # print arguments if files not given
     if not args:
         parser.print_help()
         sys.exit()
 
-    width = int(options.width)
-    height = int(options.height)
+    # get the desired size
+    try:
+        width = int(options.width)
+    except TypeError:
+        width = None
+    try:
+        height = int(options.height)
+    except TypeError:
+        height = None
 
+    # asser that we have something to do with the image
+    if not options.display:
+        if len(args) > 1:
+            raise NotImplementedError # XXX
+
+    # resize the images
     for arg in args:
         image = Image.open(arg)
         new_image = crop_resize(image, (width, height), options.exact)
-        new_image.show()
+        if options.display:
+            new_image.show()
+        else:
+            if len(args) == 1:
+                # output
+                if options.output:
+                    new_image.save(options.output)
+                else:
+                    sys.stdout.write(new_image.tostring(image.format))
 
 if __name__ == '__main__':
     main()
--- a/setup.py
+++ b/setup.py
@@ -2,17 +2,17 @@ from setuptools import setup, find_packa
 import sys, os
 
 try:
     filename = os.path.join(os.path.dirname(__file__), 'README.txt')
     description = file(filename).read()
 except:
     description = ''
 
-version = '0.1.3'
+version = '0.1.4'
 
 setup(name='cropresize',
       version=version,
       description="crop and resize an image without doing the math yourself",
       long_description=description,
       classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
       keywords='image',
       author='Jeff Hammel',