概要
- 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 内に置く。
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 )