カードマスク
カードマスクは、完成した平面のカード画像をホイル用のマスクに分解します。pokemon-cards-css のように、マスクでホイルの範囲を決めるレンダリング方式で使えます。HoloCard の主な機能とは異なり、入力は写真ではなく枠と文字のある完成したカードで、出力は視差のレイヤーではなくマスク画像です。
holocard.longsizhuo.com/masks から開きます。トレーディングカード向けの独立したツールで、トップページにはリンクを置いていません。
使い方
- 「カード画像を選ぶ」をクリックしてアップロードします。JPEG、PNG、WebP、AVIF、HEIC に対応し、16 MB までです。長辺が 1400 ピクセルを超える画像は先に縮小されます。
- 処理には 1 分ほどかかり、その間「処理中」と表示されます。
- 完了すると左にプレビューのカードが表示されます。右で「ホイルをかける場所」とホイルの種類を選ぶと、プレビューが更新されます。
- 下に各マスクと領域の一覧が並び、個別にダウンロードできます。「この組み合わせのマスクをダウンロード」では、選んだ範囲を合成した 1 枚をダウンロードします。
出力
マスクは 6 枚で、互いに重なりません。どのピクセルでも 6 枚の値を足すとちょうど 255 になります。そのため、何枚かをそのまま足せばそれらの和集合になり、境目に隙間や重複ができず、キャラクターの輪郭の半透明も保たれます。
各マスクはカード画像と同じサイズで、グレースケールとアルファの 2 チャンネルが同じ値の PNG です。白(不透明)がその範囲を表します。CSS の mask-image は既定でアルファを使いますが、輝度で使っても(mask-mode: luminance)結果は同じです。
| マスク | 内容 |
|---|---|
| 外縁 | いちばん外側の、カードの縁と同じ色の帯(ポケモンカードの黄色や銀色の縁) |
| 枠 | イラスト枠の外側で外縁より内側の部分:名前の欄、説明文の欄、下の欄。フルアートのカードでは内側パネルの外側。枠もパネルもない場合は、イラストに重なった台紙(名前の欄、タイプの欄、説明文の欄)です |
| 文字 | 検出した文字。枠内の文字やイラストに重なった文字も含みます |
| キャラクター | イラスト枠内の主体。フルアートのカードでは内側パネル内、どちらもない場合はカード全体から切り抜きます |
| エフェクト | キャラクターに接する明るく鮮やかな部分(炎、光弾など)と、キャラクターの輪郭の内側の帯 |
| 背景 | 枠(またはパネル)内のうち、キャラクター、エフェクト、文字以外の部分 |
重なる部分は 文字 > エフェクト > キャラクター > 外縁 > 枠 の順で前のものに割り当て、残りが背景になります。
ほかに領域の一覧 labels.png(RGB)があり、各ピクセルを値がいちばん大きいマスクの色で塗っています。目で確かめるのにも、プログラムで読むのにも使えます。
| 色 | RGB | 領域 |
|---|---|---|
| 灰 | 148, 163, 184 | 外縁 |
| 青 | 59, 130, 246 | 枠 |
| 橙 | 245, 158, 11 | 文字 |
| 赤 | 239, 68, 68 | キャラクター |
| 紫 | 168, 85, 247 | エフェクト |
| 緑 | 34, 197, 94 | 背景 |
完了後、GET /api/cardmask/<id> はレイアウトも返します。window はイラスト枠、panel はフルアートのカードの内側パネルです(どちらもカード画像の幅と高さで正規化し、ない場合は null)。lines は検出した文字の各行の位置と役割で、役割は name(名前の欄の左側)、hp(名前の欄の右側)、body(ワザと効果の説明)、footer(下の欄、番号、著作権表示)、art(イラスト内の文字)のいずれかです。
組み合わせ方
実物のカードのレアリティごとのホイルは、これらのマスクの組み合わせにおおむね対応します。ポケモンカードの公式マスクと照らし合わせた結果は次のとおりです。
| レアリティ | ホイルの範囲 |
|---|---|
| ノーマルのキラ(Rare Holo) | 背景。イラストの炎や光にもホイルがある場合はエフェクトを加えます |
| ミラー(Reverse Holo) | 枠 + 文字(外縁にはホイルがありません) |
| V / VMAX | 外縁 + 枠 + 背景。カードによってはキャラクターにもホイルがあり、その場合はキャラクターとエフェクトを加えます |
| VSTAR | 背景(内側パネルだけにホイルがあります)。キャラクターにもホイルがある場合はキャラクターとエフェクトを加えます |
| シークレット | 外縁 + 枠 + 背景 + エフェクト |
| かがやく | 外縁 + 枠 + 文字 + キャラクター + エフェクト |
同じレアリティでもカードによって異なる場合があるため、カードのデザインに合わせて選んでください。
検出方法と制限
トレーディングカードの各要素の位置はおおむね決まっており、検出ではそれを利用しています。
- イラスト枠と内側パネル:モデルを使いません。カード幅の大部分にわたる長い直線から候補の矩形を作り、辺のそろい具合と中身がイラストらしいかで枠を選びます。枠がカードの上半分にあることを前提にしており、ポケモン、マジック、遊戯王はいずれも当てはまります。左右がカードの縁に接し、高さがカードの半分を超える矩形は枠ではなく、フルアートのカードの外枠の線です。この場合は内側パネル(左右が縁から約 4% 内側、上端が名前の欄のすぐ下、高さがカードの約 77〜80%)を探します。どちらもない場合はカード全体をイラストとして扱い、イラストに重なった台紙(マジックのボーダーレスカードの名前の欄、タイプの欄、説明文の欄、ポケモンカードのルールの欄)を探します。文字の各行から上下にいちばん近い長い横線を、その間で左右にいちばん近い長い縦線を探し、四辺がそろい、幅がカードの 60% を超え、内側が外側の帯より平らなものを台紙として枠に含めます。文字がイラストに直接印刷されたカード(ポケモンのイラストレア)には台紙がありません。模様のある説明文の欄(羊皮紙など)や、細かいイラストに重なった半透明の説明文の欄は見つからないことがあります。
- 文字:PaddleOCR の PP-OCRv4 文字検出モデルで、位置だけを検出し、内容は読み取りません。検出した各行は位置で役割を分けます。枠(パネル)より上は名前の欄、下は説明文、いちばん下は下の欄です。フルアートのカードの上半分にある文字はイラスト内の文字とみなします。
- キャラクター:BiRefNet_lite による切り抜きです。フルアートのカードでは、下半分のワザの欄やエネルギーの球を主体とみなすことが多い一方、実物のカードのキャラクターが説明文の欄に入り込むことはまれです。そのため、いちばん上の説明文の行から下に向かってキャラクターを徐々に薄くします。物が多い画面では、画面の大部分を主体とみなすことがあります。
- 外縁:画像の四辺から内側に向かって、四辺の色の中央値に近く、縁から遠くない連続した部分を取ります。色の変化が大きい縁(ホロの銀色など)は取り切れないことがあります。
- エフェクト:規則による判定で、モデルを使いません。背景そのものが明るく鮮やかな場合(一面の炎など)は、多く取りすぎたり取りこぼしたりします。
プライバシーと保存期間
アップロードしたカードと生成したマスクはデータベースに保存されず、公開もされません。アドレスはランダムで、24 時間後に削除されます。処理は HoloCard のサーバーで行い、第三者には送信しません。