丘と水路と橋と火を

言葉と技術

ゲームボーイで撮った写真を楽しむ

TL;DR

はじめに

最近、ゲームボーイの『ポケットカメラ』で写真を撮ることにハマっている。

ポケットカメラ&ポケットプリンタ

ポケットカメラゲームボーイポケット用の周辺機器として1998年2月21日に発売された。ゲームボーイポケットの周辺機器ではあるが、ゲームボーイ用のカートリッジとなっているためゲームボーイアドバンスまでのゲームボーイシリーズで動作させることができる。別売りの『ポケットプリンタ』と通信ケーブルで接続すれば、撮影した写真を印刷することも可能。

この記事を執筆している時点で、なんと発売から25周年。四半世紀前のデバイスで、モノクロ4階調・画素数14336(縦112×横128ピクセル)という限られた性能ではあるのだが、その写真の独特な味わいによって今なお多くの愛好家がいる。

Web上にはすでに『ポケットカメラ』についての情報が多くあるが、実際に利用してみるといろいろ工夫が必要な部分もあると思ったため、自身で経験した範囲で情報を記載する。

なお、今回は以下を用意した上で作業を実施する。

  • ゲームボーイは旧タイプ(DMG-01、いわゆる「初代」)を使用。
    • ここはアドバンスまでならどの機種を利用してもいい。
  • ポケットカメラ』はメルカリで動作確認済みの中古品を購入。
    • 状態にもよるが、執筆時点で3,000円~。
  • Windows 10
    • WSL2により、Ubuntu 20.04も利用。
  • GAMEBANK-web.comの「レトロベースダンパーV3」と「GBAプラグインアダプター V2.1」、およびレトロダンパーのクライアントソフト
    • このあたりはGAMEBANK-web.comやWeb上の記事を見てもらったほうが良いと思う。

ポケットカメラからセーブデータを吸い出す

まず、Windows 10環境でデータの吸出しを実施。

レトロダンパーにGBAプラグインアダプターをセットした上で『ポケットカメラ』を差し込み、その状態でレトロダンパーとPCをUSBケーブルで接続する。

ポケットカメラをレトロダンパーに差し込みUSBケーブルでPCと接続
ポケットカメラをレトロダンパーに差し込みUSBケーブルでPCと接続

USBケーブルで接続後、レトロダンパーのクライアントを立ち上げて「GB」を選択。この状態で「Info」ボタンを押すと、以下のように設定が行われる。

レトロダンパーのクライアント設定
レトロダンパーのクライアント設定

上記画像の状態で、「SAVE」内にある「Read」を押し、ファイルの保存先を選択。これによって、RAMからゲームのセーブデータ(.sav)が取得できることになる。

セーブデータを吸い出した後、レトロダンパーを取り外してゲームボーイで『ポケットカメラ』を起動すると、画像データがすべて削除された状態になるため注意。レトロダンパーを取り外すまでは何回でもセーブデータの吸出しができるようであるため、おそらく取り出しかなにかのタイミングでRAMの内容が消去されているのではないかと思う。*1

セーブデータから撮影画像をPNGとして抽出する

次に取得したセーブデータ(.sav)から、撮影した画像をPNG画像として抽出する。ここでは抽出にgbcam2pngというCLIツールを利用する。同様のツールは他にgbcamextractなどもあるが、gbcam2pngの方が撮影した画像のリスト表示や画像を指定した上での変換など利用可能なオプションが豊富でかゆいところに手が届く印象。gbcam2pngの作者がブラウザ上でポケットカメラのセーブデータから画像を表示するWebアプリも用意しているので、もしCLIツールの用意が面倒ならまずはこちらを利用してもよいと思う。

gbcam2pngはLinux環境のほうが利用しやすいため、WSL2でUbuntuを起動。まずはgbcam2pngのリポジトリの内容をgit cloneGitHubからのZipダウンロードなどで手元に取得する。ここではgit cloneで実施。

# 適当なディレクトリで以下を実施。
git clone https://github.com/raphnet/gbcam2png.git

利用のためにはmakeソースコードから実行ファイルをビルドしないといけないため、必要に応じ以下を実施してビルドするための環境を準備。

# gcc, makeをインストール
sudo apt install build-essential
# libpngを利用してビルドするため、libpng-devをインストール
sudo apt install libpng-dev

上記までできたら、gbcam2pngをビルド。

# gbcam2pngのディレクトリ内に移動
cd path/to/gbcam2png
# makeでビルドする
make all

ビルドが正常に終了して実行ファイルが手に入れば、あとはgbcam2pngを利用してセーブデータからPNG画像として撮影した画像を抽出できる。ゲーム上、削除されていると思わしきデータも一緒に取れてくる場合もあるように思われるが、そういう不要なデータは適宜手作業で削除するなどして対応。

# データが吸い出せているか、撮影データの一覧を取得してチェック
./gbcam2png source.sav -l
# 撮影データ中、ゲーム上で削除していないデータをすべてpngファイルとして出力する
./gbcam2png source.sav -b output_file_prefix

取得できる画像は以下のような感じ。ピクセルパターンによるグラデーションがとても味わい深い。

ポケットカメラで撮影した桜の花
ポケットカメラで撮影した桜の花

よりゲームボーイ実機での表示に近い画像に変換する

gbcam2pngで取得できるのはモノクロ4階調の画像。このままでも良いが、よりゲームボーイ実機での見え方に近づけたいと思ったため、緑色中心の4階調の画像に変換する。

以下のようなコードを用意し、gbcolorconv.pyと名前を付けた。これはgbcam2pngで抽出した画像のカラーマップをGB風のカラーマップに変換したPNG画像を生成するスクリプトとなっている。なお、ここではgbcam2pngの作者によるWebアプリで利用されていた色の指定を参考に色の指定を行っている。

スクリプト中でNumpyとOpenCVを利用しているため、事前にpipでインストールした上で利用する。

# venvで仮想環境を作りアクティベート
python -m venv venv
source venv/bin/activate
# pip installで必要なパッケージをインストール
pip install opencv-python
pip install numpy

これは以下のように、色を変換したいPNG画像を1枚指定して利用する。元画像のファイル名_gb.pngというファイル名で、元画像と同じディレクトリに色を変換した画像を生成するようになっている。

python gbcolorconv.py target_photo.png

これを通した後の画像は以下のようになる。ゲームボーイの液晶っぽさが伝わるだろうか。

ゲームボーイの液晶での表示風に色調を変換した桜の花の写真
ゲームボーイの液晶での表示風に色調を変換した桜の花の写真

findxargsと組み合わせると、特定のフォルダ内のPNG画像を一括して変換することも可能。

find ../target_directory/ -regextype posix-egrep -regex ".*.png" -type f | xargs -I {} python gbcolorconv.py {}

PCの性能や画像の枚数にもよるが、8GBのWindows 10で20枚の画像を変換させたら1分程度で完了した。変換中、対象のフォルダをエクスプローラーなどで見ているとぽこぽこファイルが生成されていくのがみえて面白い。

自分がとりあえず使えればいいや精神で適当に作ったスクリプトなので、NumpyをインポートしているのにわざわざPythonのリストで処理していたりする(NumpyはOpenCVにデータを引き渡すときの変換用にだけ利用している)。このあたり、かなり無駄があると思う。あとでもうちょっとちゃんと書き直したいが、そうしたらもっと処理は早くなるかも。

おわりに

上記流れを一通りできると、撮った写真がPCやスマホなど現代のデバイスでも利用できるようになり、楽しさが倍増する。行く先々でゲームボーイを取り出して写真を撮影する姿は、慣れてくるとちょっと大きめのスマホで撮影していると思えなくもない(もしかすると周囲からはぎょっとされるのかもしれない)。画像の解像度は荒いが、明るさやコントラストを調整して取れば屋外でも何を撮影しているか十分伝わる写真が撮れるし、何よりこのピクセル感が逆に味。

25年前のデバイスながら、すでに自撮りもできるし、その画像をキャラクターとして使ってちょっとしたゲームも楽しめるようになっているしで、現代のスマホでの写真撮影や任天堂Miiなどのアバターを先取りしているとも感じられる。

Instagramなどで『ポケットカメラ』による写真を公開している方も多く、そうした写真を見るだけでもとても面白い。Web上を見ればThe 2022 Guide to Game Boy Camera Photographyなどつい最近公開されたようなホットなリソースから、技術資料的なディープなリソースまで様々あり、まだまだ楽しめるデバイスだと思う。

というわけで、今後浅野に会う機会があればゲームボーイで一緒に自撮りを取りましょう。どうぞ皆様よろしくお願いいたします。

*1:このあたり、浅野の理解が足りていない可能性があります。有識者求みます……!