iOSのホーム画面とロック画面の画像の抽出方法

はじめに

私のiPhoneの壁紙はポケモンスタイル(昔あった壁紙やアイコンをポケモンのデザインに着せ替えるためのiPhone,Android用アプリ)で購入したイーブイの壁紙なのですが、
ポケモンスタイルがサービスを終了し、その壁紙画像をiPhoneのフォトライブラリから削除してしまったため、
このイーブイの壁紙の画像を手に入れることができなくなりました。
なので、この記事は、iPhoneの壁紙をなんとかして、画像として抽出することを目指したものです。

ちなみに、私の環境はMacBook AiriPhone SE(第1世代)です。
全体的な流れとしては、iOS端末からcpbitmapファイルを抽出して、それをpngに変換するという感じになります。

 

▼可愛いイーブイを救出せよ!!(まるで気分はポケモンレスキューのようだ)

f:id:satoshi31043104:20200702141900p:plain

f:id:satoshi31043104:20200702141905p:plain

iOS端末を事前にiTunesでバックアップしておく

f:id:satoshi31043104:20200702142015p:plain

iBackupBotでcpbitmapファイルを抽出

iBackupBotmacにインストール
ロック画面のファイルの場所は、
System Files/HomeDomain/Library/SpringBoard/LockBackground.cpbitmap
ホーム画面のファイルの場所は、
System Files/HomeDomain/Library/SpringBoard/HomeBackground.cpbitmap
となります。

f:id:satoshi31043104:20200702142228p:plain

この2つのファイルを右クリックExport selected item(s)で任意のフォルダ(ここではDownloadフォルダ)に抽出します。

f:id:satoshi31043104:20200702142256p:plain

Pythonまわりの設定

pythonコードにPythonの画像処理ライブラリPillow(PIL)が必要なので、それをインストールします。
pipがインストールされていない場合、

$ sudo python -m ensurepip

で有効にし、

$ sudo pip install --upgrade pip

で最新版にします。 PILのインストールをします。

$ sudo pip install Pillow
$ pip list

でPillowが入っていることを確認します。

cpbitmapをpngPythonコードでもって変換する

以下はconvert_cpbitmapです。これをDownloadフォルダに作成します。

#!/usr/bin/python
from PIL import Image,ImageOps
import struct
import sys
if len(sys.argv) < 3:
print "Need two args: source_filename and result_filename\n";
sys.exit(0)
filename = sys.argv[1]
result_filename = sys.argv[2]

with open(filename) as f:
contents = f.read()
unk1, width, height, unk2, unk3, unk4 = struct.unpack('<6i', contents[-24:])
im = Image.frombytes('RGBA', (width,height), contents, 'raw', 'RGBA', 0, 1)
r,g,b,a = im.split()
im = Image.merge('RGBA', (b,g,r,a))
im.save(result_filename)

これを実行可能にします。

$ chmod 755 convert_cpbitmap

Pythonコードを実行します。

$ ./convert_cpbitmap HomeBackground.cpbitmap HomeBackground.png
$ ./convert_cpbitmap LockBackground.cpbitmap LockBackground.png

これで救出できました!!めでたしめでたし。

f:id:satoshi31043104:20200702143332p:plain

ちなみに、この画像を手に入れた私は、iPadにも同じ壁紙を適用しましたとさ。

参考資料

iOSのcpbitmapの抽出関連
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11108634676
https://apple.stackexchange.com/questions/32989/is-it-possible-to-export-the-current-iphone-wallpaper
pipのインストール
https://teratail.com/questions/35614
PILのインストール
https://note.nkmk.me/python-pillow-basic/
pythonコード
https://gist.github.com/danielsharvey/929a525712a2b89ebb561226cc32f3e7
https://stackoverflow.com/questions/7998324/dot-cpbitmap-images-imgaename-cpbitmap/