最近、Chromebookを持ち歩いて出かけることが多い。本連載の67回目で紹介したように、ChromebookではLinux(Debian)が動かせるので、急な頼まれごとがあっても大抵のことができる。そして、今回出先で依頼されたのは「至急100枚の画像を正方形に切り抜いて欲しい」という依頼だった。せっかくなのでChromebookを利用した仕事術として、画像を正方形にリサイズする方法を見てみよう。もちろん、今回のプログラム自体はWin/Mac/Linux問わず動かすことができる。

  • ChromebookのPythonで画像100枚を正方形に切り抜いたところ

    ChromebookのPythonで画像100枚を正方形に切り抜いたところ

ChromeOSのバージョンアップでLinuxとの親和性が向上した

本連載の67回目でChromebookにLinuxをセットアップして、Pythonを動かす方法を紹介したのは、2020年のことだった。あれから、ChromebookのOS「ChromeOS」も順調にバージョンアップを繰り返し、LinuxとChromeOSの親和性が向上して、より使いやすいものになっている。以前はLinuxで起動したWebサーバーやLinux上のファイルにアクセスするのに設定が必要で面倒だったが、現在では設定が不要になった。

筆者が使っているChromebookは2020年に4万円前後で購入した10インチのIdeaPad Duetだ。格安マシンながらブラウザで資料を見ながらLinux上のPythonでプログラムの作成や実行が問題なく使える。スペックがそれほど高くないので、メインマシンとしてはちょっと力不足に感じる場面もあるが、簡単なスクリプトを動かすだけなら十分に実用的だ。購入からそれなりに時間が経っているが、小さなカバンに入れて持ち運べるので普段から重宝している。

  • 気に入って使い込んでいるChromebookのIdeaPad Duet

    気に入って使い込んでいるChromebookのIdeaPad Duet

なお、唯一の不満点はLinux側の日本語入力だ。もちろん、Linux側にもIMEをインストールすれば日本語入力が使えるのだが、設定が複雑でうまく設定できなかったり何かとトラブルも多い。とは言え、既にChromeOS側にしっかりしたIMEが搭載されている。そこで、テキストの編集が必要な場面では、ChromeOS側にインストールしたテキストエディタを使うことができる。

そのため、プログラムや文章の作成はChromeOS側で行うことにし、PythonやLinuxのプログラムを実行するのにLinuxを使うと割り切ってしまうと快適に使える。ChromeOSの物足りなさを十分に補ってくれるのがLinuxであり、Linux側の問題点をChromeOSで補うことができるのだ。

  • ChromeOS側[左]でプログラムを編集しLinux側[右]でPythonを実行

    ChromeOS側[左]でプログラムを編集しLinux側[右]でPythonを実行

ChromebookでLinuxを有効にする手順

なお、ChromebookでLinuxを有効にする方法だが、OSがバージョンアップして、前回紹介した時と手順が少し変わった。そこで、ここでも簡単にChromebookにLinuxをインストールする方法を確認しておこう。原稿執筆時点の最新のバージョン97.0.4692.102を利用した。

最初に、アプリの一覧からChromeOSの「設定アプリ」を開こう。

そして、設定アプリの画面左側にある「詳細設定」をタップしよう。次に、デベロッパーの中にある「Linux開発環境」の横にある[オンにする]ボタンをタップする。

  • 設定アプリからLinux開発環境をオンにしよう

    設定アプリからLinux開発環境をオンにしよう

すると「Linux開発環境をセットアップする」というダイアログが開くので、右下にある[次へ]ボタンを押そう。次に出る設定画面を確認したら「インストール」ボタンをタップしよう。すると、Linuxのイメージがダウンロードされて簡単にセットアップが完了する。

  • Linuxのセットアップ画面

    Linuxのセットアップ画面

そして、アプリの一覧から「Linuxアプリ > ターミナル」を起動すると、仮想マシンのLinux(Debian)が起動する。

なお、ChromeOSの「ファイル」アプリを起動して、画面左側に出ている「Linuxファイル」をタップすると、Linux環境内のファイルにアクセスできる。

Linuxで「touch ファイル名」などとやって空ファイルを作り、ChromeOS側のテキストエディタでそのファイルを開けば編集が可能となる。なお、筆者が使っているエディタは、chromeウェブストアからインストールした「Text」というChromeアプリだ。

  • Linux内のファイルをテキストエディタで開く方法

    Linux内のファイルをテキストエディタで開く方法

100個の画像ファイルをリサイズして正方形に切り抜こう

Chromebookの話が長くなってしまったが、今回のプログラムを作ってみよう。マルチプラットフォームで動作するPythonのプログラムなので、実際のところ、Win/Mac/Linuxと、どのOSでも動かすことができる。

今回作るのは、JPEG画像をリサイズして正方形に切り抜くというプログラムだ。大抵スマートフォンのカメラで撮影した写真は縦横の比率が3:4など長方形になる。しかし、Webサイトなどに掲載する場合、正方形だとデザイン的に配置しやすい場面も多い。そこで、今回作るプログラムは、Web掲載用に100枚の画像をPythonのプログラムで640x640ピクセルに切り抜くというものだ。

ここでは、画像処理のためにPillowモジュールを使うことにしよう。Chromebookには、最初からPythonがインストールされているが、パッケージマネージャーのpipコマンドやパッケージをビルドするための環境が入っていない。そこで、以下のコマンドを実行して必要なパッケージをインストールしよう。

# ChromebookのLinuxを使う場合
sudo apt update
sudo apt install python3-pip build-essential libssl-dev libffi-dev python3-dev libjpeg-dev zlib1g-dev

また、多くのPython環境ではPillowが最初からインストールされているが、Chromebookではインストールされていない。以下のコマンドを実行してPillowをインストールしよう。

# Pillowのインストール
python3 -m pip install Pillow

【今回のプログラム】

そして、以下のプログラムが100個の画像ファイルを640x640の正方形に切り抜くプログラムだ。

import os, glob
from PIL import Image

# 画像ディレクトリを指定 --- (*1)
in_dir = './in_images'
out_dir = './out_images'
if not os.path.exists(out_dir): os.mkdir(out_dir)

# JPEGファイルを列挙して処理する --- (*2)
for file in glob.glob(in_dir+'/*.jpg'):
    img = Image.open(file) # 画像ファイルを読む
    # 正方形に切り抜く --- (*3)
    w, h = img.size # サイズを得る
    r = h
    if w < h: r = w
    img = img.crop(((w - r) // 2, (h - r) // 2, 
                   (w + r) // 2, (h + r) // 2))
    # リサイズ --- (*4)
    img = img.resize((640, 640))
    # ファイルに保存 --- (*5)
    savename = os.path.basename(file)
    img.save(os.path.join(out_dir, savename))
    print("saved:", savename)

先に、プログラムを確認してみよう。(*1)では読み込み画像と出力画像のディレクトリを指定している。(*2)では読み込み画像の一覧を列挙する。Pillowを使って画像ファイルを読み込み、(*3)で正方形に切り抜く処理を行う。(*4)で640x640ピクセルにリサイズし、(*5)で出力画像のディレクトリに保存するという処理となる。

なお、プログラムの実行にあたり、画像ファイルをプログラムと同じディレクトリの「in_images」というフォルダにコピーしておこう。

  • 画像をin_imagesというフォルダにコピーしておこう

    画像をin_imagesというフォルダにコピーしておこう

そして、実行するには、ターミナルから以下のコマンドを実行する。

python3 resize.py

すると、正方形に切り抜いた画像が、out_imagesというフォルダ以下に生成される。

  • コマンドを実行したところ

    コマンドを実行したところ

次いで以下のようなHTMLを表示するプログラムを作り実行してみると、HTMLが作成されるので、ブラウザで画像の一覧を確認できる。

import glob
html = "<html><body>"
for f in glob.glob("out_images/*.jpg"):
    html += "<img src='" + f + "'>"
open("a.html","wt").write(html)
  • すると100枚の正方形の画像が生成される

    すると100枚の正方形の画像が生成される

まとめ

以上、今回はChromebookでPythonを実行する方法を解説しつつ、100枚の画像を正方形に切り抜き指定サイズにリサイズするプログラムを作ってみた。もちろん、この手の作業を、画像編集ソフトを利用して手作業で切り抜くこともできるが、100枚も画像があったら膨大な時間がかかるに違いない。

なおベンチマークのため、「time python3 resize.py」を実行してみたところ、16.3秒で100枚の画像(1枚2MB程度のJPEG画像)を切り抜くことができた。(マシンスペックは、CPU: Helio P60T/2GHz, メモリ4GB。)格安のモバイル端末でありながら、Linux仮想マシンを動かし、その上で気軽に画像処理のプログラムを開発し動かせるのだから、つくづく良い時代になったなぁと思う。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。