Search code examples
pythonimagemagicksubprocessimagemagick-convert

Using ImageMagick's "convert" utility as a Python subprocess


I'm looking to convert a large directory of thumbnails.

Instead of using the PythonMagick wrapper I'd like to access the convert binary directly (I have a lot of flags, and think this would be more efficient for a large quantity of photos.)

Are there any working examples of using ImageMagick as a subprocess? Or, is there a better way to do this?

Specifically, I'm not sure how to start and end a Python subprocess from within a class. My class is called ThumbnailGenerator. I'm hoping to make something like this:

>> t = ThumbnailGenerator()
>> t.makeThumbSmall('/path/to/image.jpg')  
>> True

Solution

  • Here's what I've used in a personal project:

    def resize_image(input, output, size, quality=None, crop=False, force=False):
        """
        Invoke ImageMagick's `convert` utility to resize an image.
    
        Arguments:
    
            input - the path of the input file
            output - the path of the output file
            size - a size string in the format <width>x<height> 
            quality - a number indicating the JPEG quality (100 = best)
            crop - Boolean value indicating whether to crop the image
                to the given size instead of scaling it
            force - Boolean value indicating whether to overwrite the
                output image even if it exists
        """
        if (not force and os.path.exists(output) and
            os.path.getmtime(output) > os.path.getmtime(input)):
            return
        params = []
        if crop:
            params += ["-resize", size + "^"]
            params += ["-gravity", "Center", "-crop", size + "+0+0"]
        else:
            params += ["-resize", size]
        params += ["-unsharp", "0x0.4+0.6+0.008"]
        if quality is not None:
            params += ["-quality", str(quality)]
        subprocess.check_call(["convert", input] + params + [output])
    

    This will start one process per conversion. If the source images aren't too small, the process startup overhead will be comparatively small.