雑食性雑感雑記

知識の整理場。ため込んだ知識をブログ記事として再構築します。

ImageMagick + Wand で画像の正方形化

概要

  • ImageMagick を用いて画像のトリミング、正方形化を行う。
  • 正方形化した画像をリサイズ。
  • 実際の処理は Python ( Wand ) を用いる。

前提条件

  • Linux 環境で実施 ( CentOS )
  • ImageMagick & Wand がインストールされていること。

正方形化

  • 「image.crop( left, top, right, bottom )」を使用。
  • 画像のサイズを取得し、短辺に合わせて left, top, right, bottom を決定し、crop する。
def __squareImage( image ) :
    '''
    画像の正方形化
    @param image 画像オブジェクト
    '''

    width  = image.width
    height = image.height

    # 短辺に合わせたサイズ設定
    left = right = top = bottom = 0
    if width > height :
        left   = ( width - height ) / 2
        right  = left + height
        top    = 0
        bottom = height
    else :
        left   = 0
        right  = width
        top    = ( height - width ) / 2
        bottom = top + width

    image.crop( left, top, right, bottom )

リサイズ

  • 「image.resize( width, height )」を使用。
def __resizeSquareImage( image, size ) :
    '''
    正方形画像のリサイズ
    @param image 画像オブジェクト (正方形)
    @param size  リサイズ後の1辺のサイズ
    '''
    image.resize( size, size )

画像変換スクリプト作成

  • 実行形式「python square_images.py [src_dir] [dest_dir] [size]」
    • src_dir 内の画像を指定 size で変換し、dest_dir 内に置く。
  • 以下、スクリプト。
    • 上で書いた部分は省略。
# -*- coding: utf-8 -*-
from glob import glob
from wand.image import Image
import os, sys

def __squareImage( image ) :
    pass # 記述省略。上に記載のものと同様

def __resizeSquareImage( image, size ) :
    pass # 省略。

def __saveImage( image, path ) :
    '''
    指定されたパスに画像を保存
    @param image
    @param path
    '''
    image.save( filename = path )

def squareImage( src_path, dest_path, size ) :
    '''
    入力パスの画像を正方形変換し、出力パスに保存する。
    @param src_path
    @param dest_path
    @param size      変換サイズ
    '''
    try :
        image = Image( filename = src_path )

        __squareImage( image )
        __resizeSquareImage( image, size )

        __saveImage( image, dest_path )
        print "Save image \"{0}\".".format( dest_path )

    except Exception as e :
        print "Failed to transform image \"{0}\"./{1}".format( src_path, e )

def squareImages( src_dir, dest_dir, size ) :
    '''
    入力ディレクトリ内の画像を正方形変換し、出力ディレクトリ内に保存する。
    ディレクトリは全て存在していることを前提とする。
    @param src_dir
    @param dest_dir
    @param size     変換後サイズ
    '''

    src_filenames = glob( src_dir + "/*" )
    for name in src_filenames :

        basename  = os.path.basename( name )
        dest_path = "{0}/{1}".format( dest_dir, basename )
        squareImage( name, dest_path, size )
        
if __name__ == '__main__' :

    argv = sys.argv
    argc = len( argv )

    if argc < 4 :
        print "Usage: $ python %s <src_dir> <dest_dir> <size>".format( argv[0] )
        quit()

    src_dir  = argv[1]
    dest_dir = argv[2]
    size     = argv[3]

    # 入力ディレクトリ無ければエラー
    if not os.path.exists( src_dir ) :
        print "Source directory \"{0}\" is not found.".format( src_dir )

    # 出力ディレクトリ無ければ作成
    if not os.path.exists( dest_dir ) :
        print "Create destination directory \"{0}\".".format( dest_dir )
        os.mkdir( dest_dir )

    # サイズが正しくなければエラー
    try :
        size = int( size )
    except Exception as e :
        print "Size parameter \"{0}\" is incorrect format./ {1}".format( size, e )
        quit()

    # 実行
    squareImages( src_dir, dest_dir, size )
  • 別スクリプト内で import できることも考えて、ディレクトリ版とファイル版の 2つの処理に分けた。

実行結果

  • 処理前
    • ( 何故か同じ処理後と同じ画像がブログに表示される。。)
  • 処理後 ( dog.jpg, 150px )
    • 正方形になってます。

f:id:kazuki_nagasawa:20131211221027p:plain