見出し画像

Medibang Paintのデータを視覚的に整理するために解析してみた

リリース当時からMedibang Paintユーザ

デジタルイラストを描くツールはいろいろあるけど、自分はずっとMedibang Paint(以下Medibang)を使っている。「ファイアアルパカ」という名称のころかに、PCで無料で使えるイラストソフトということで選択。以降、メインの作業環境がiPadに代わっても今までの作業方法をあまり変えずに済むということでMedibangを使い続けてきた。

Medibangで「複数の原稿を一覧表示」したい場合、Medibang社のクラウドに原稿をアップロードしないといけない。このクラウドはしばらくの間容量制限がなかったんだけど、サブスクサービスを始めたタイミングで無料ユーザの容量が3GBまでに制限されてしまった。過去のイベント用の原稿も置きっぱなしにしておくにはちょっと心許ない容量だ。
それに、一覧表示された原稿を並び替える場合、その操作をクラウド上に反映する処理が発生するのでページ配置を少し変えるだけでも時間がかかる。

これはやってられないということで、「Medibang Paintのサムネイルを一覧表示する処理を自分で作れないか?」と思い至った。

先人に学ぶ

Medibangのファイル「.mdpファイル」をイチから解析するのは面倒なので、過去に解析している人がいないか調査。

すると、かなり細かく解析している人の記事が見つかった。

  • 先頭がXML、残りはバイナリデータの羅列

  • サムネイル画像の幅、高さはXML部分に記載

  • 各レイヤの情報の先頭は「PAC 」という文字列

というところまで解析している。先頭文字列に規則があるというのは解析する上で非常にありがたい。
だけど、実際に画像を抜き出すという部分は行っていないから、ここから先は自力。

バイナリデータ確認

キャンバスサイズとバイナリデータ長は比例する気がしたので、50×50pixelの小さいキャンバスを持つmdpファイルを作ってみる。
ファイルの仕様を確かめるだけなら、B5とかA4サイズの解像度はいらないからね。

そのファイルをStirlingで開いてみると、確かに上記サイトと同じような形式のデータが表示された。さらに、以下の規則がある。

  • 「thumb」とか「layer0img」とかで露骨に区切られた部分がある

  •  区切りのあと、最初に現れるバイナリデータは必ず「78 9C」

「thumb」の区切り
「layer0img」の区切り

これで、「78 9C~次のPAC の手前まででひとつのファイルで、78 9Cはファイルの種類を示すヘッダではないか」とアタリがつく。

そこで78 9Cでググると、zlibっていう圧縮ファイルのマジックナンバーらしいことが分かる。
このバイナリデータがzlibとして展開できるか試すために、ZLIBEXEっていうソフトを使ってみる。

すると、展開に成功、以下のようなバイナリデータが出現した。

FF(16) = 255(10)だから、これは何となく「色情報を1pixelずつ0~255の範囲で表現しているんだろう」と予想できる。
XML部分を見るとサムネイルサイズは256×256=65536pixel。
展開後のzlibは262144byteだったから、4byteで1pixelとすれば割り切れる。つまり、ARGB情報の可能性が高い。

ということで、以下のような処理を実装。

  • バイナリデータ部分からサムネイルのzlibデータ部分を抜き出す

  • zlibを展開

  • XML部分からサムネイルの幅、高さを抜き出す

  • 抜き出したサイズで画像を作成

  • 展開したzlibから色情報を取得し、1pixelずつ書き込む

XMLからの抜き出し方法(正規表現)は考えるのが面倒だったのでChatGPTに丸投げしたけど、何も手を入れずにちゃんと動いてくれた。
これでサムネイル画像が取得できたので、無事解析成功。
ついでにデータの並び替えにも対応させたものが以下。

あとはこの表示順に連番を振ってファイルをリネームする処理を作れば、ローカルのデータをかなり快適に整理することができる。

こんな感じでファイル解析をしてみたけど、ほかに解析結果をここまで解説している記事がググっても見つからなかったので備忘録としてまとめておいた。

この記事が気に入ったらサポートをしてみませんか?