2010年02月03日

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

今日は家のメンテで、一日家にいたので、ちょっと遊んでた。

縮小するプログラム[明鏡止水]を、サブディレクトリまで読むように変更した。
参考にしたコードは、pythonライブラリのcopytree[python.jp]。

しかし、こう細々アップデートしていると、管理がメンドイ。Google Codeのアカウント作ってみようかなぁ。

コード

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

import os, sys,glob
from PIL import Image

# 出力先フォルダ指定。
TARGET_DIR = u"C:\\PHOTO"
#for COWON A3
max_size = (800, 480)
#for PSP
#max_size = (480, 270)
#対象拡張子
ext_dic = [".jpg",".jpeg",".png",".bmp"]

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

class ProgressBar:
    def __init__(self,totalNum):
        self.totalNum = totalNum
        self.counter = 0
        self.chr = u"*"
        self.width = 32
        self.bar_text_space = 4
    def addCounter(self,incrementNum):
        self.counter += incrementNum
    def show(self):
        pbar_chrs = self.chr * (self.width * self.counter / self.totalNum)
        percentage = 100 * self.counter / self.totalNum
        print u"\r|%-*s| %*d/%d個 (%3d%%)" % \
            (self.width, pbar_chrs, self.bar_text_space, self.counter,self.totalNum, percentage),
        sys.stdout.flush()

def countImageFileNum( path ):
    counter = 0
    names = os.listdir(path)

    for name in names:
        srcname = os.path.join(path, name)
        try:
            if os.path.isdir(srcname):
                counter += countImageFileNum( srcname )
            else:
                  root, ext = os.path.splitext(srcname)
                  if isTarget(ext) == True:
                      counter += 1
        except (IOError, os.error), why:
            print "Can't copy %s : %s" % (`srcname`, str(why))
    return counter

def shrinkImage(srcFileName,dstFileName):

    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)))

def copyImageTree(src,dst,progress):

    names = os.listdir(src)
    makeOutputDirectory(dst)

    for name in names:
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if os.path.isdir(srcname):
               copyImageTree(srcname, dstname,progress)
            else:
                root, ext = os.path.splitext(srcname)
                if isTarget(ext) == True:
                    shrinkImage(srcname,dstname)
                    progress.addCounter(1)
                    progress.show()
        except (IOError, os.error), why:
            print(u"Can't copy %s to %s: %s" % (`srcname`, `dstname`, str(why)))


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: 
        progress = ProgressBar(countImageFileNum( sourcePath ))
        copyImageTree(sourcePath,(TARGET_DIR + u"\\" + os.path.basename(sourcePath)),progress)

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

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


※画像の中の文字を半角で入力してください。

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

[Python] 画像の縦横比を見て回転させ縮小するプログラム Ver6&amp;alpha;
Excerpt: [記事]で挙げた問題点の標準出力のは、まだ良いアイディアが思いつかいないけど、とりあえずバックアップ目的で晒しておく。 コード #!/usr/bin/env python # -*- coding..
Weblog: 明鏡止水
Tracked: 2011-03-22 01:04