① 描き文字SFXの透過は「AI被写体除去(rembg/BiRefNet/SAM)」では解けない。課題が逆だから。 rembg等は人/物の輪郭を学習しており、文字の細い線・グロー・しずくの半透明を「背景ノイズ」として削る[11][12]。SFXに正しいのは 単色背景からの色キー抜き = Color to Alpha 型(GIMP/Krita方式)。これは半透明を保ったまま指定背景色だけを抜く[13][14]。
② ComfyUIで線質変換するなら、透過生成(LayerDiffuse)はimg2img非対応[15]。だから「不透明背景で生成→後段で色キー」が唯一の正攻法。 背景は文字色から最大距離の単色(黒文字→#00FF00緑 or #FF00FFマゼンタ)で生成し、NumPyの距離キーで抜く。denoiseは 0.35〜0.55、字形維持に ControlNet lineart/canny を併用。
③ 「貼るだけ」品質は3点で決まる: straight alpha・decontaminate(背景色除去)・3色展開。 premultipliedは配布先で暗フチhalo事故[8][9]→straight一択。透明画素のRGBは近傍色で埋め(alpha bleed)[4]、白背景でも黒背景でも置けるよう白縁版/黒縁版を両収録。最後に pngquant→oxipng でサイズ最適化[7]。
本DRの一貫した主張: 「切り抜く」のではなく「色を抜く」。SFXは輪郭で囲える被写体ではなく、半透明の集合体だから、距離ベースの色キー+色復元(decontaminate)が原理的に正しい。AI mattingは「キャラ立ち絵/物体素材」専用と割り切る。
BOOTH/DLsiteの素材カテゴリでは「クリスタ素材」だけで4,000点超、「psd」で45,000点超が流通しており[16]、漫画素材(街並み・手描きボタン・効果音文字)は透過PNG+PSD+クリスタ用の複数形式同梱が標準パッケージになっている[16]。
| 需要シグナル | 内容 | 含意 |
|---|---|---|
| 形式同梱が標準 | 「クリスタ/PSD/PNG」の3点セットが上位素材の定型[16] | 透過PNG単品では差別化不足。PSD同梱で単価UP |
| 解像度分け要求 | BOOTHは印刷用/WEB用に解像度分けを推奨(1GB上限のため)[5] | サイズ展開がパッケージ価値を上げる |
| 入稿基準 | DLsiteはPSD推奨・350dpi作成推奨[17] | 原寸は350dpi基準で作るのが安全 |
| SFXは恒常需要 | 描き文字(オノマトペ)は全ジャンル漫画・CG集で消費される消耗素材 | 1テーマ量産→束売りでLTVが伸びる |
透過品質が低い(縁ハロー/背景色残留/白消失)とレビューで即叩かれ、素材は「貼るだけで使える」前提が崩れる→返品・低評価。透過品質=商品の核。
「①最初から透過で描く ②単色背景から色キー除去 ③AI背景除去 ④img2img出力の透過化」を、SFX/描き文字に対する適合度で序列化した。
| # | 手法 / ツール | 品質 | 自動化 | SFX適合 | 備考(根拠) |
|---|---|---|---|---|---|
| 1 | 最初から透過で描く(PIL/RGBAで生成) | ◎最高 | ◎ | ◎ | 既に達成済。透過化が不要=事故ゼロ。ComfyUI変換しない素材はこれが最善 |
| 2 | Color to Alpha(距離キー) GIMP/Krita方式をNumPy実装 | ◎ | ◎ | ◎ | 半透明を保持しつつ指定色だけ抜く。SFX透過の本命[13][14] |
| 3 | 輝度キー(白背景の黒線画:α=255−luminance) | ○ | ◎ | ○ | 黒主体の線画SFXに有効。白文字には無力[18] |
| 4 | クロマキー(緑/マゼンタ背景→色差で抜く) | ○ | ◎ | ◎ | img2img出力の本命。spill除去(decontaminate)必須 |
| 5 | LayerDiffuse(latent transparencyで透過生成) | ◎ | ○ | △ | txt2imgのみ。img2img非対応=線質変換と併用不可[15] |
| 6 | BiRefNet_HR / HR-matting(2048px,2025) | ◎ | ◎ | △ | キャラ/物体素材には最高精細。SFXの半透明は苦手[11][19] |
| 7 | rembg + alpha_matting(fg240/bg10/erode10) | ○ | ◎ | △ | 被写体前提。エッジ平滑化は優秀だがSFXの細線を削る[12][20] |
| 8 | ComfyUI-RMBG(RMBG-2.0/BiRefNet/SAM/INSPYRENET統合) | ◎ | ◎ | △ | キャラ素材の量産抜きに。foreground refinement有効[19][21] |
| 9 | SAM / SAM2(プロンプト指定セグメント) | ○ | △ | × | クリック指定向き=量産不適。SFXに非推奨 |
| 10 | Photoshop アクション(手動Defringe/色域指定) | ◎ | × | ○ | 品質高いが手作業=量産不適。仕上げ検証用に |
白文字を白背景から輝度で抜くのは原理的に不可能(白=白で差が出ない)。正攻法は「白文字を単独で出さない」設計に倒すこと。
cv2.dilate(edge,kernel,iterations=2)で膨張→輪郭内をマスク化して透明制御。運用ルール: 白文字SFXは単独白フィルを禁止。必ず黒縁 or 影 or グローを伴わせる。これで「白背景で消える」事故が構造的に消える。
GIMP/Krita方式[13][22]を距離キー+色復元(decontaminate)としてベクトル実装する。pixelループ禁止・全画素同時処理[22]。
import numpy as np
from PIL import Image
def color_to_alpha(img_rgb, target=(0,255,0), t_transp=20, t_op=80):
"""単色背景 target を抜き、半透明エッジと元色を保つ straight alpha RGBA を返す。
t_transp 以下=完全透明 / t_op 以上=完全不透明 / 間=線形補間。"""
a = img_rgb.astype(np.float32)
tgt = np.array(target, np.float32)
# 1) 距離 = チャンネル最大差 (GIMP orthogonal distance)
dist = np.max(np.abs(a - tgt), axis=2) # (H,W)
# 2) alpha
alpha = np.clip((dist - t_transp) / (t_op - t_transp), 0, 1)
# 3) decontaminate: 背景色寄与を引き戻して元色を復元
p = np.maximum(dist / t_op, 1e-6)[..., None] # opacityへの比
rgb = (a - tgt) / p + tgt
rgb = np.clip(rgb, 0, 255)
out = np.dstack([rgb, alpha * 255]).astype(np.uint8) # straight alpha
return Image.fromarray(out, "RGBA")
距離は max(|ΔR|,|ΔG|,|ΔB|)(GIMPの直交距離)[13]。decontaminate式 new=(orig−target)/(dist/t_op)+target が「半透明画素から背景色を引き戻して本来の文字色を出す」核心[22]。これでフチに背景色が残らない。
| 狙い | t_transp | t_op | 効果 |
|---|---|---|---|
| 標準SFX | 20 | 80 | ベタ部不透明・縁は自然なAA |
| ベタ重視(縁ハロー嫌) | 25〜30 | 80 | 弱い色をバッサリ透明化(AAハロー除去) |
| グロー/しずく保持 | 10 | 90 | 低distanceの薄い領域も緩く残す |
2パス処理が安定(Grok補強): ①ベタ層を t_transp=28 で厳しめに抜く → ②グロー層を t_transp=10,t_op=90 で緩く抜く → α同士を max 合成。ベタの締まりと半透明の柔らかさを両立できる。
color_to_alpha(target=(0,255,0), t_transp=25, t_op=80) で抜く。G = min(G, max(R,B)))。なぜ緑/マゼンタか: 線質変換後も背景は単色のまま残りやすく、文字(黒/白/赤)とRGB距離が最大になる色を選ぶと距離キーが綺麗に分離する。肌色SFXなら補色のシアン背景等、文字主色の補色を選ぶのが原則。
縮小・回転・他ソフト貼り込みで出る黒/白フチ(fringe)の根治[4]。透明画素のRGBを不透明側の色で膨張させ、αは保つ。
from scipy import ndimage
import numpy as np
def alpha_bleed(rgba, iters=8):
arr = np.array(rgba); rgb=arr[...,:3].astype(np.float32); a=arr[...,3]
solid = a > 0
for _ in range(iters):
# 各チャンネルを不透明側の最大値で外周へ滲ませる(αは不変)
for c in range(3):
dil = ndimage.maximum_filter(np.where(solid, rgb[...,c], 0), size=3)
rgb[...,c] = np.where(solid, rgb[...,c], dil)
solid = ndimage.maximum_filter(solid.astype(np.uint8), size=3) > 0
arr[...,:3] = np.clip(rgb,0,255).astype(np.uint8)
return Image.fromarray(arr, "RGBA")
Image.save(..., "PNG") は標準でstraight。premultipliedで保存すると配布先(After Effects等の誤解釈含む)で暗フチhalo[8][9]。pytoshop でレイヤー(文字/グロー/影)を別レイヤーとして書き出す[23][24]。購入者がClip Studio/Photoshopで色変更・合成可能になり単価が上がる。potrace でベクトル化(前処理 mkbitmap で2値化)[25]。グロー/グラデSFXはSVG化に不向き=対象を絞る。# pytoshop 最小例: 透過レイヤー1枚をPSDで書き出す
import pytoshop, numpy as np
from pytoshop.user import nested_layers as nl
img = np.array(rgba) # RGBA
layer = nl.Image(name="SFX", visible=True,
channels={-1: img[...,3], 0: img[...,0], 1: img[...,1], 2: img[...,2]})
psd = nl.nested_layers_to_psd([layer], color_mode=3) # 3=RGB
with open("sfx.psd","wb") as f: psd.write(f)
描き文字SFX素材集を1パッケージ=「100語×3色×サイズ2展開+PSD」で構成した場合のモデル。
| 項目 | 素人品質(透過甘い) | プロ品質(本DR適用) |
|---|---|---|
| 単価 | ¥300〜500 | ¥800〜1,500(PSD/3色/印刷対応) |
| レビュー | 「縁が汚い」「白で消える」低評価 | 「貼るだけで使える」高評価→検索上位 |
| 制作工数/パッケージ | 生成のみ | +透過自動化(初期構築後は1パッケージ数十分) |
| 束売りLTV | 単発で終わる | シリーズ化(Vol展開)で継続購入 |
透過パイプラインは初期構築コスト1回で、以後は全パッケージに横展開できる固定資産。単価2〜3倍×低返品率×シリーズLTVで、構築コストは数パッケージで回収。
| リスク | 原因 | 対策 |
|---|---|---|
| 背景色残留(spill) | クロマ背景の色がエッジに残る | decontaminate必須+緑抑制(§4-D)[10] |
| 暗/白フチhalo | premultiplied保存・透明画素RGBがゴミ | straight固定+alpha bleed[8][4] |
| 白文字消失 | 白背景に白フィル | 黒縁/影テンプレ化(§4-A)[18] |
| α段差(ジャギ) | 8bitパレットPNG化 | 常にRGBA32bitで保存[2] |
| 字形崩壊 | img2img denoise過大 | 0.55以下+ControlNet字形固定 |
| 商用ライセンス事故 | 素材内に第三者著作物混入 | 自作生成のみ・READMEに利用規約明記[5] |
本質: 透過事故の9割は「①背景色がRGBに残る ②透明画素のRGBがゴミ ③premultiplied」の3つに集約。本DRのdecontaminate+alpha bleed+straight固定で原理的に潰せる。
color_to_alpha+alpha_bleed+trimをモジュール化。手持ちSFX10点でColor to Alphaの閾値(t_transp/t_op)を実測キャリブレーション。| # | 失敗 | 原因 | 潰し方 |
|---|---|---|---|
| 1 | 緑/マゼンタspill(縁に背景色) | decontaminate漏れ | §4-B式必須+緑抑制 |
| 2 | JPEG中間保存でブロックノイズ混入 | 非可逆圧縮がキー破壊 | 全工程PNG/EXR固定・JPEG厳禁 |
| 3 | 8bitパレットPNGでα段差 | PNG-8でαが粗化 | RGBA32bitで保存(配布最適化はpngquant任せ) |
| 4 | 回転素材のbbox端切れ | trim時に余白ゼロ | trim前に必要余白を残す(姉妹DRの式) |
| 5 | AAハローが白/黒で目立つ | t_transpが低すぎ | t_transpを25〜30へ |
| 6 | グロー/しずくが消える | t_opが厳しすぎ | t_opを90へ+2パス処理 |
| 7 | 白文字が白背景で消える | 白フィル単独 | 黒縁/影テンプレ化 |
| 8 | premultipliedで暗フチ配布事故 | 保存方式誤り | straight固定 |
| 9 | 解像度不足で印刷不可 | 72dpiのみ | 350dpi原寸+WEB用を別出力[17] |
| 10 | ファイルサイズ肥大でDL遅延 | 無圧縮+無駄メタ | pngquant→oxipng --opt 4 --strip all[7] |
| DR | 関係 |
|---|---|
DR_透過PNG素材のプロ品質基準と自動検品_2026-06-11.html | 姉妹DR。端切れ/余白/3面検版/validate_png.py。本DRの検品はこれを土台に拡張 |
| feedback_sfx_novelai_realmeasure_v8_recipe_2026-06-11 | SFX生成レシピ(白フィル/縦書き/ピンク実測)。§4-Aの前提 |
| feedback_salvage_onomatopoeia_from_ai_images_2026-06-11 | AI画像からのオノマトペ抽出(領域検出→OCR)。素材源の拡張 |
| ms_2026-06-11_cc4_manga_assets_fable5 | 漫画素材販売への転換・SFX v2確立。本DRの商品化の上位方針 |
| reference_eromanga_yougo_daijiten_2026-06-11 | 用語/擬音辞典。収録語の企画に流用 |
本DRは Claude(Opus 4.8)が1次情報を収集・統合し、Grok-4.3(grok_router経由)で技術論点A〜Gを補強検証。脚注は実在URL(社内2件除く)。姉妹DRと非重複(手法選定・ComfyUI透過化・量産パイプライン・付加価値形式に特化)。