iPad Pythonista 3:写真をリサイズするプログラム


(2021.09.26)

はじめに

M1 iPad Pro 12.9-inch を買った。メインで使っている M1 MacBook Air よりも高価なので、それよりも働いてもらわなくてはならない。しかし、iPad では Python を Macと同等には使えない(ライブラリやアプリの安定性などのため)ので、せめてブログの更新ぐらいは iPad Pro でやろうと思った。 この場合、テキストを打ち込むくらいならどうにでもなるのであるが、iPad の標準機能では写真のリサイズができない。そこで iPad アプリである Pythonista 3 で画像サイズを変更するプログラムを作った。このプログラムではピクセルの横サイズは 800 に固定している。

この文書は、iPad Pro で作成しているが、MacBook Air と接続した 27-inch display を用いながらの文書作成と比べると、やはり窮屈な気がする。しかしながら、iPad では、文字(表示領域)の拡大などは片手でスッとできるので、慣れによっては快適になるかもしれない。

使い方

使い方は以下の通り。

  • リサイズしたい写真は Files アプリの中に適当なフォルダを作成しそこにコピーしておく。
  • Pythonista 3 と Files を split view で開く。
  • Files アプリから写真が保存されているフォルダを選択し写真を見て表示。
  • 共有メニューのアイコン (四角に上矢印) を開き、Run Pythonista Script => Edit Script => プログラム (この場合 py_resize.py) を選択して実行。
  • 実行結果として、プログラムが格納されている Pythonista のフォルダにリサイズされた写真が保存される。ファイル名は、元の名前の前に ‘800_’ がつき、拡張子は ’jpg’ となっているはず。
  • Pythonista でリサイズされた写真を選択肢、Open in… を選択し、Save to Files で保存したいフォルダを選択肢実行。

写真を回転

写真を回転させたい時は、Files アプリの機能を使う。 写真の上で右クリック (長押し) ・メニューを表示し、回転(Rotate Left or Rotate Right) を選択•実行すれば良い。

写真事例

iPhone SEで撮った写真を、このプログラムを使ってリサイズしたもの。 iPad Pro 12.9-inch で split view。左は Pythonista 3、右は Files の画面。 MacBook Airは開いていない!

プログラム(py_resize.py)

mport appex
import Image
import os

def main():

    if not appex.is_running_extension():
        print('Running in Pythonista app, using test image...')
        img = Image.open('IMG_0001.JPG')
        fpath= 'current'
    else:
        img = appex.get_image()
        fpath=appex.get_file_path()
    if img:
        # TODO: Your own logic here...
        print(fpath)
        print('(original)',img.format)
        print('(original)',img.size)
        fname=os.path.splitext(os.path.basename(fpath))[0]
        fw='800_'+fname+'.jpg'
        print(fw)
        width=800
        height=int(float(width)/float(img.size[0])*float(img.size[1]))
        img.thumbnail((width, height), Image.ANTIALIAS)
        img.save(fw, 'JPEG', quality=100, optimize=True)
        img=Image.open(fw)
        print( '(changed)',img.format)
        print('(changed)',img.size)

    else:
        print('No input image found')

if __name__ == '__main__':
    main()

以 上