2011年03月22日

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

[記事]で挙げた問題点の標準出力のは、まだ良いアイディアが思いつかいないけど、とりあえずバックアップ目的で晒しておく。

コード

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

from __future__ import print_function
import os, sys,glob
import multiprocessing
from multiprocessing import Pool
from PIL import Image

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

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

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

class ProgressBar:
	def __init__(self,totalNum):
		self.totalNum = totalNum
		self.counter = 0
		self.chr = u"*"
		self.width = 40
	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
		meter = u"\r|{0}{1}| {2}/{3}個 ({4}%)".format(pbar_chrs,u' ' * (self.width - len(pbar_chrs)),self.counter,self.totalNum, percentage)
		sys.stdout.write(meter)
		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",srcname,":",str(why))
    return counter

def shrinkImage(srcFileName, dstFileName):

	sourceImage = Image.open(srcFileName)
	destImage = sourceImage

	if max_size[0] > max_size[1]:
		#横が長いディスプレイの場合は縦長の画像を回転させる。
		if destImage.size[0] < destImage.size[1]:
			destImage = destImage.rotate(270)
	else:
		#縦が長いディスプレイの場合は横長の画像を回転させる。
		if destImage.size[0] > destImage.size[1]:
			destImage = destImage.rotate(270)
	destImage.thumbnail(max_size, Image.ANTIALIAS)
	destImage.save(dstFileName)

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"Cant' copy",srcname,u"to",dstname,u":",str(why))
		
def transferImage(sourcePath):
	progress = ProgressBar(countImageFileNum(sourcePath))
	copyImageTree(sourcePath,(TARGET_DIR + u"\\" + os.path.basename(sourcePath)),progress)
	
if __name__=='__main__':
	#引数がおかしい場合
	if len(sys.argv) < 2:
		print(u"Usage: # Python ",sys.argv[0],u" [souceimagedirectorypath]...")
		raw_input()
		quit()
		
	targetPathList = []
	for x in range(1,len(sys.argv)):
		sourcePath = os.path.dirname(unicode(sys.argv[x],"mbcs") + '\\')

		if os.path.isdir(sourcePath) == False:	#存在しないPathを指定した場合
			print('[',soucePath,']: Src directory does not exist.')
			raw_input()
			quit()
		elif os.path.isdir(TARGET_DIR) == False:	#存在しないPathを指定した場合
			print('[',TARGET_DIR,']: Dest directory does not exist.')
			raw_input()
			quit()
		elif sourcePath == TARGET_DIR:	#入力先と出力先が同じ場合
			print('The input destination is the same as the output destination.')
			raw_input()
			quit()
		else:
			targetPathList.append(sourcePath)

	processnum = multiprocessing.cpu_count() if ((len(sys.argv)-1) > multiprocessing.cpu_count()) else (len(sys.argv)-1)
	pool = Pool(processes=processnum)
	pool.map(transferImage,targetPathList)
参考
  • [Python] 画像の縦横比を見て回転させ縮小するプログラム Ver5[記事]
タグ:Python
posted by MINE at 01:04 | Comment(0) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする | edit
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


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

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