LoginSignup
8
7

More than 5 years have passed since last update.

CLIP STUDIO PAINTで作成した漫画データのサムネール出力の為の調査

Posted at

参考ページ

CLIP STUDIO PAINTの.lipファイルをハックして作業動画を書き出すWindowsアプリを作った – NET BIZ DIV. TECH BLOG
イラストを Git で管理したかったのでツールをつくった - blog.syfm

思いつき

上記ページを見ていて、もしかしたら漫画制作時のcmcファイルもsqlite3のデータなんじゃないかと思い、sqliteに通してみたら案の定sqlite3のデータベースファイルになっていた。

97fd553a212f1691a1a87d99134e495e56b2b8db.png

ページ順の取得

テーブルが存在するということは各clip/lipファイルを指し示す部分があるはずという事でCanvasNodeを見てみると、LinkPathに「ディレクトリ相対パスっぽいの:ファイル名」という形式で含まれているのが判ったため、CanvasNodeで順番さえとれれば、参考ページにあるようなサムネール抽出をページ順に名前付けして出せそうだという事が判った。

しかし、ナイーブツリーなパターンだったので一発で抽出するには再帰クエリが必要だった。

仕様っぽいの

  1. LinkPathがNULLのデータがツリールート
  2. ツリールートからはFirstChildIndexを参照して最初のページ情報を取得出来る。
  3. _PW_IDではなくMainIdが各インデックス参照に利用されている。
  4. 2ページ目以降はNextIndexが次のページ情報を指し示している。
  5. NextIndexが0になったら最終ページ

ただし、単純な漫画用データを見た結果なのでこれで全て扱えるかというと多分違う。

実験

example.sql
WITH RECURSIVE r2 AS (
    WITH RECURSIVE r1 AS (
        SELECT CanvasNode.* FROM CanvasNode WHERE NextIndex = 0 AND LinkPath is NULL
        UNION ALL
        SELECT CanvasNode.* FROM CanvasNode, r1 WHERE CanvasNode.MainId = r1.FirstChildIndex
    )
    SELECT * FROM r1
    UNION ALL
    SELECT CanvasNode.* FROM CanvasNode, r2 WHERE CanvasNode.MainId = r2.NextIndex
)
SELECT LinkPath FROM r2 WHERE LinkPath IS NOT NULL;

a3228bf6da71fb1c01afbe9910bf9502eeaa74b9.png

画像のクエリでは一部_PW_ID見てるけど、たまたま_PW_IDMainIdが同じレコードを指してたので大丈夫だった。

各clip/lipファイルから画像を抜く

とりあえず実験の為、参考ページにあった画像抽出コマンドを書いておく。

sqlite3 page0010.lip "SELECT quote(ImageData) FROM CanvasPreview" | cut -d\' -f2 | xxd -r -p > page10.png

コマンドでやる場合は直接SELECTしても上手く通らないのでquoteで16進数文字列に変換してからシングルクオートを取り除いたものをバイナリに戻してファイルにリダイレクトしてるのか。なるほど。

879ae88d18ba959f113fec4d3d8d04f6f6beda35.png

a9cb9c090087547f6d13e65701981c9486f20fde.png

雑感

なにか作りたい。golangで。

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7