2009年01月26日

Pythonの日本語処理がわけわかめ

どうも日本語処理のエラーが直しきれない。

途中で日本語Pathがある場合と、終端が日本語Pathで現在エラーが出ているのだが、どっちか直すと別のライブラリでエラーが出て、両方のテストに通るコードが書けない・・・。

さっき修正したやつ[明鏡止水]も、修正しきれてないんだろうな・・・。

posted by MINE at 00:43 | 🌁 | Comment(0) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする | edit

2009年01月25日

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

前回[明鏡止水]作ったプログラム、Pathに日本語が含まれているとエラー吐くので修正。Python、日本語周りが面倒・・・。

コード

#!/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"]

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 shrinkImage(sourcePath): 
    outputDirPath = os.path.join(TARGET_DIR, getOutputDirectoryName(sourcePath))
    makeOutputDirectory(outputDirPath)

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

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

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

    if os.path.isdir(sourcePath) == False:    
        print('The directory does not exist.')
        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 19:06 | Comment(0) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする | edit

2009年01月18日

絶対Pathでディレクトリ構造をコピーするには、どうすればいいんだ?

前作った画像コピーのプログラム[明鏡止水]を、再帰的にディレクトリ読んでコピーするように変更しようと思ったんだけど、上手くいかない。

これ[はてな]参考に作ってみたんだけど、相対Pathでしか動かない。
ドラッグ&ドロップすると、絶対Pathになるのでそのままじゃ使えない。

処理速度とか考えなければ、色々と回避策は思いつくけど、スマートにやるにはどういうコードにすればいいのか全然思いつかない・・・。

posted by MINE at 19:51 | ☀ | Comment(0) | TrackBack(0) | Python | このブログの読者になる | 更新情報をチェックする | edit

2009年01月11日

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

2009/1/25追記
日本語周りでバグがあったので修正をしました→[ 明鏡止水]。


昨日、酒飲んで帰ってきたらなかなか寝付けなかったので、プログラム組んでみた。

電車でCOWON A3やPSPを使用しているのだが、大きい画像を見ると小さく表示されてしまうので、液晶の解像度にあわせて縮小ソフトを使用して転送してた。
でも、それだと縦長と横長の画像を関係なく小さくしてしまうので、画像の大きさにあわせて自動で回転して縮小するプログラムが欲しいなーと思って書いてみた、

開発環境は、Python2.6.1[ Python Japan User's Group]とPIL1.1.6[ Python Imaging Lirary]を使用。

使用方法

  1. TARGET_DIRのPath(必要ならmax_size)を変更する
  2. 転送したい画像のフォルダをドラック&ドロップで、pythonに放り込む

コード

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

import os, sys,glob
from PIL import Image

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

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_dir:
        return True
    else:
        return False

def shrinkImage(sourcePath):

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

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

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

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

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

まー、酒飲みながら書いたコードなんで適当だけど。
再帰的フォルダを読むようにするともっと楽に転送できるかなー。

Blogに書いて思ったこと

  • 0byteの画像ファイルを渡したらどうなるんだろう?
  • ルートディレクトリを指定するとどうなるんだろう?
タグ:Python
posted by MINE at 00:39 | Comment(0) | TrackBack(1) | Python | このブログの読者になる | 更新情報をチェックする | edit