pythonista3 で Evernote に貼る写真を小さくする

習慣化8日目

iPhoneEvernoteで写真を貼ると画面一杯に表示される

日記などに食事や出かけたときの写真を貼っています。
見返した時に思い出が鮮明に蘇ってかなり楽しいです!

ただiPhoneEvernoteだと貼り付けた写真が画面一杯に表示されるため、たくさん貼ると一覧性が低くちょっと見にくいです。

f:id:tkrou:20200611074625j:plain
写真バーン!

デスクトップ版Evernoteだと写真の四隅をドラッグすることで小さく出来るようなのですが、iPhone版にはその機能がありません。
そこでpythonista3のスクリプトを使って、evernoteに貼る写真を小さくしたいと思います。

実行結果を先に見ておく

f:id:tkrou:20200611083157j:plain:w300
いくらでも貼れる!

こんな感じで、Evernoteで写真を小さく表示します。

pythonスクリプトの作成

スクリプトのみ抜粋

import photos
import os
from PIL import Image
from objc_util import *

def cra():
 UIScreen = ObjCClass('UIScreen')
 screen = UIScreen.mainScreen()
 screen.setBrightness(0.6)

assets = photos.pick_asset(title='Pick some assets', multi=True)

if assets is None:
 cra()

right=700

for asset in assets:
 img = asset.get_image()

 width, height = img.size

 while height > 300:
  img = img.resize((int(img.width / 2), int(img.height / 2)))
  width, height = img.size
 new_width = width + right
 result = Image.new(img.mode, (new_width, height), (255, 255, 255))
 result.paste(img, (0, 0))
 result.save("photo.png")
 photos.create_image_asset("photo.png")
 os.remove("photo.png")

cra()

スクリプト準備の流れ

フォルダとファイルを準備する

写真用のスクリプトを配置するフォルダ「Photo-kanren」を作成し
「photo4evernote.py」というスクリプトを準備しました。

f:id:tkrou:20200611075542j:plain:w300
スクリプト作成の準備

スクリプトの作成

上記「スクリプトのみ抜粋」を貼ればOK。
以下は内容について確認しておきます。

import関連

# pythonista3 で photo関連をいじるモジュール
import photos

# フォルダやファイル操作のモジュール
# 一時ファイルの削除に使用
import os

# リサイズなど画像処理まわりのモジュール
# PIL(Python Image Library)
from PIL import Image

# 処理が終わった後にクラッシュさせている
# そのときに使用している
from objc_util import *

必要なモジュールをインポートします。

終了処理としてのクラッシュ関数の定義

# クラッシュすればなんでもいい
# 別のスクリプトをテストしていたときにどうしてもクラッシュしてしまった処理を活用
def cra():
 UIScreen = ObjCClass('UIScreen')
 screen = UIScreen.mainScreen()
 screen.setBrightness(0.6)

pythonista3 のスクリプトは実行後にpyhonista3が起動した状態で終わります。
写真をリサイズしたあとに閉じて欲しいので、
スクリプトをクラッシュさせて、無理矢理iPhoneのホーム画面に戻しています。

Magic Lancher という有料のアプリを使用すれば
URLスキーマを利用してホーム画面に戻ることもできるのですが、
その場合 Magic Lancher が毎回起動してしまうので、ちょっとアレかもしれないけどクラッシュする方法をとっています。

Magic Lancher 自体はめちゃめちゃ便利です! iPhoneの下のドックに入れているほど活用しています。
たまーにセールで無料になっているのでぜひ!

リサイズする写真の選択

assets = photos.pick_asset(title='Pick some assets', multi=True)

写真サムネイルから、リサイズする写真を選択する処理です。

f:id:tkrou:20200611082020j:plain:w300
痩せようとしてるのがバレる

multi=True を指定して、複数写真を同時にリサイズできるようにしています。
取得した写真の情報を assets にリスト形式で入れています。

# もし Cancel なら終了する
if assets is None:
 cra()

写真を選ばずに Cancel を押した場合、
assets が None になります。
そのままスクリプトを終了するため、クラッシュ用に作成しておいた cra() を呼び出し終了させています。

右に追加する余白のサイズを指定する

right=700

写真をリサイズするだけなら他のアプリでもできます。
ただ、iPhoneEvernoteはサイズが小さい写真もある程度の大きさに引き伸ばして表示してくれます。
そのため最初に出した実行結果程度に小さく表示しようと思うと、かなり写真が荒くなります。

そこで今回のスクリプトは、写真の右側に白い余白を追加して
結果iPhone Evernoteの画面で小さく見えるようにしています…!!

写真のサイズ調整と余白の追加

# 選択した画像の分だけ forループ処理
for asset in assets:

 ## 画像データを取得して img に入れる
 img = asset.get_image()

 ## 画像のサイズを取得する
 width, height = img.size

 ## 画像の高さが300より下になるまで小さくする
 while height > 300:
  img = img.resize((int(img.width / 2), int(img.height / 2)))
  width, height = img.size

 ## 小さくした画像の右側に余白を追加した画像サイズを出す
 new_width = width + right

 ## 余白を追加したサイズの白い画像を result に保存
 result = Image.new(img.mode, (new_width, height), (255, 255, 255))

 ## 準備した白い画像の左側に小さくした画像を貼り付ける
 ## これで右側に白い余白をもった画像が準備できた
 result.paste(img, (0, 0))

 ## 結果をphoto.pngというファイル名で保存する
 ## このファイルは一時的なもの
 ## 一旦ファイルにしないと、カメラロールに保存できないため
 result.save("photo.png")

 ## 準備したファイルを写真として作成 これでカメラロールに表示される
 photos.create_image_asset("photo.png")

 ## 一時ファイルのphoto.pngを削除する
 os.remove("photo.png")

クラッシュさせて終了

cra()

スクリプトをホーム画面に追加する

下記手順で追加する。

tkrou.hatenablog.jp

以上!

写真の撮れる毎日を!

これでEvernoteにたくさん写真を貼れるようになりました!
あとは、何度も思い出したくなるようなステキな日々を過ごすだけです!

それが一番難しい……