2010年02月01日

[Python] 画像の縦横比を見て回転させ縮小するプログラム Ver4

画像転送するプログラム使ってたが[明鏡止水]、多数のファイルが入ってるフォルダを突っ込むといつ終わるか分からん!!!

と思って、プログレスバー付けてみた。
あんまテストしていないけど、動きそうなので更新。

後は、複数フォルダも対応させようかなぁ。

コード

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# 引数で指定したフォルダの画像ファイルを
# 出力先フォルダに縮小・回転しながらコピーする

import os, sys,glob
from PIL import Image

# 出力先フォルダ指定。
TARGET_DIR = u"C:\\PHOTO"
#COWON A3向け
max_size = (800, 480)
#PSP向け
#max_size = (480, 270)
#対象拡張子
ext_dic = [".jpg",".jpeg",".png",".bmp"]
#プログレスバーの設定
progress_bar_width = 32
progress_bar_text_space = 4
progress_bar_chr = "*"

def getOutputDirectoryName(sourcePath):
    dirName = os.path.split(sourcePath)
    return dirName[1]

def makeOutputDirectory(outputDirPath): 
    if os.path.isdir(outputDirPath) == False:
        os.mkdir(outputDirPath)

def isTarget(ext): 
    if ext.lower() in ext_dic:
        return True
    else:
        return False

def show_progress_bar(pbar_chr, pbar_width, total, current_num):
    pbar_chrs = pbar_chr * (pbar_width * current_num / total)
    percentage = 100 * current_num / total
    print u"\r|%-*s| %*d/%d個 (%3d%%)" % \
        (pbar_width, pbar_chrs, progress_bar_text_space, current_num, total, percentage),
    sys.stdout.flush()

def countFileNum( path ):
    counter = 0
    for file in os.listdir( path ):
        if os.path.isdir( path + file ) == False:
            root, ext = os.path.splitext(file)
            if isTarget(ext) == True:
                counter += 1
    return counter

def shrinkImage(sourcePath):

    outputDirPath = os.path.join(TARGET_DIR, getOutputDirectoryName(sourcePath))
    makeOutputDirectory(outputDirPath)

    total = countFileNum( sourcePath )
    count = 0
    for infile in glob.glob(os.path.join(sourcePath,"*.*")):
        root, ext = os.path.splitext(infile) 
        if isTarget(ext) == True:
            sourceImage = Image.open(infile)
            destImage = sourceImage
            # 縦長の画像の場合、回転させる
            if destImage.size[0] < destImage.size[1]:
                destImage = destImage.rotate(270)
            destImage.thumbnail(max_size, Image.ANTIALIAS)
            destImage.save(os.path.join(outputDirPath,"s_" + os.path.basename(infile)))
            count += 1
            show_progress_bar(progress_bar_chr, progress_bar_width,total, count)

if __name__=='__main__':
    #引数の数がおかしい場合
    if len(sys.argv) != 2: 
        print('Usage: # python %s [SourceImageDirectoryPath]' % sys.argv[0])
        quit()

    sourcePath = os.path.dirname(unicode(sys.argv[1],"mbcs") + '\\')

    if os.path.isdir(sourcePath) == False: 
        print('[%s]: Src directory does not exist.' % sourcePath)
        quit()
    elif os.path.isdir(TARGET_DIR) == False: 
        print('[%s]: Dest directory does not exist.' % TARGET_DIR)
        quit()
    elif sourcePath == TARGET_DIR: 
        print('The input destination is the same as the output destination. ')
        quit()
    else:
        shrinkImage(sourcePath)

タグ:Python
posted by MINE at 00:55 | Comment(0) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする | edit
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/139906038
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック