feat(image-meta): 画像ファイルの詳細メタデータパネルを追加#26
Open
simota wants to merge 6 commits into
Open
Conversation
ファイルの右クリックで「親フォルダを開く」、ディレクトリで「フォルダを開く」 を追加し、OSのファイラ(Finder/Explorer/xdg-open)でフォルダを開けるように。 サーバに POST /api/reveal を新設(ディレクトリのみ許可・root外/localhost外は拒否)。
単一画像ビュー横にトグル式の情報パネルを追加し、サーバ側の GET /api/image/meta で構造化メタデータ(基本+寸法 / EXIF / 色・形式 / GPS / AI provenance / Raw全タグ)を抽出して表示する。 - server.mjs: /api/image/meta エンドポイント(safePath / 400-403-404-415 / best-effort 抽出で破損画像も200) - lib/image-meta.mjs: 寸法パーサー(PNG/JPEG/GIF/WebP/BMP/SVG)、 exifr による EXIF/GPS/color、AI生成判定、c2pa-node のフルC2PA検証(縮退対応) - NFR-2: 全バイトを読まない — 寸法/色はヘッダスライス、EXIF/GPS は exifr に パス渡しで範囲読み、PNG text チャンクはストリーム走査(IDAT を読み飛ばし、 末尾チャンクも捕捉=AC-9維持)、C2PA は FileAsset(path)。重い依存は遅延ロード - src/image-meta-panel.ts: 折りたたみセクション、コピー、開閉状態の永続化、 DOMPurify による untrusted 文字列のサニタイズ - GPS は座標+OpenStreetMap外部リンク(target=_blank rel=noopener) - tests/image-meta.spec.ts: API/UI の E2E(289 passed / 3 skipped)
verified = validation_status.length===0 は厳しすぎ、success コード (.validated/.trusted/.match)やトラストリスト外の署名者 (signingCredential.untrusted)まで「検証失敗」と表示していた。 - validation_status のコードを分類: 改ざん系の失敗コードの有無で integrity を、 untrusted の有無で署名者の信頼性を別々に判定 - パネルを3状態表示に: ✓検証済み / ⚠改ざんなし・発行者未検証(トラストリスト外)/ ✗検証失敗(改ざんの可能性)。実際の検証コードも併記して透明化
c2pa-node の完全パース(read)に依存していたため、実画像(例: OpenAI gpt-image の Content Credentials)で "general.error: missing data box" となりパース不能だと、 (1) 明白に存在する C2PA を取りこぼし、(2) trainedAlgorithmicMedia を見落として isLikelyAiGenerated を false にし、(3) パース失敗を「✗ 検証失敗(改ざん)」と誤表示 していた(参照: remove-ai-image/check_metadata.py のバイト署名スキャンでは検出可能)。 - detectC2paFromBytes(): JUMBF/c2pa 署名・trainedAlgorithmicMedia・AI生成元 (gpt-image 等) をストリーム走査で確実に検出(c2pa-node のパース可否に非依存、NFR-2) - detectAiProvenance(): C2PA 存在/AI由来はバイト走査を信頼源とし、暗号検証は c2pa-node がパースできた時のみ best-effort。verifyState を verified/untrusted/failed/unparsed の4状態に。parse 不能は 'unparsed'(≠改ざん) - AI_TOOL_PATTERNS に gpt-image/openai/imagen 等を追加 - パネル: 4状態表示。'unparsed' は「ℹ C2PA 検出(詳細検証不可)」 - tests: 解析不能だが存在する C2PA + AI由来の検出を回帰ガード
C2PA非搭載の画像でも、本文やメタデータに AI ツール名(openai/gemini/flux 等)が 偶然含まれるだけで AI 生成と誤判定していた。PDCAで精度を定量改善。 Before/After (ラベル付きコーパス6件, AI-flag): precision 0.50 → 1.00 / recall 1.00 → 1.00(2 cycles, stop=target-met) - detectC2paFromBytes: 生成元名シグナルを C2PA 検出にゲート。非C2PA画像の 偶然の単語一致を AI シグナルにしない(非C2PAのAI由来は PNG tEXt の SD/ComfyUI params と EXIF Software 経路がフィールド限定で担当)。 trainedAlgorithmicMedia は C2PA 固有語のため検出トリガ兼用で維持。 - detectAiProvenance: NovelAI 判定を明示的 "novelai" シグネチャ要求に厳格化。 汎用 Comment tEXt の存在だけで NovelAI 誤認する不具合を修正。 - tests: 非C2PA画像のAIツール名誤検出を防ぐ precision 回帰テストを追加。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
画像ファイルを開いたまま詳細メタデータを把握できる情報パネルを追加します。単一画像ビュー横にトグル式パネルを表示し、サーバ側の
GET /api/image/metaが構造化メタデータを返します。仕様:
docs/specs/image-metadata-panel.md(/nexus specでロック、/nexus apexで実装)表示項目
target=_blank rel=noopener、クリック時のみ外部送信)isLikelyAiGeneratedは明示条件(生成パラメータ / 既知AIツール名 / C2PAtrainedAlgorithmicMedia)のみで真。C2PA の存在だけでは AI と断定しない実装
server.mjs:/api/image/meta(safePath / 400-403-404-415 / best-effort で破損画像も 200)lib/image-meta.mjs: 寸法パーサー(PNG/JPEG/GIF/WebP/BMP/SVG)・exifr・AI判定・c2pa-nodesrc/image-meta-panel.ts+src/main.ts+src/style.css: パネル UI(DOMPurify で untrusted 文字列サニタイズ、開閉状態を localStorage 永続化)exifr、c2pa-nodeNFR-2(メモリ効率)
巨大画像でも全バイトを読まない: 寸法/色は先頭 256KB スライス、EXIF/GPS は exifr にパス渡しで範囲読み、PNG text チャンクはストリーム走査(IDAT を読み飛ばしつつ末尾チャンクも捕捉=AI検出の完全性を維持)、C2PA は
FileAsset(path)。重い依存は遅延ロードでサーバ起動を軽量に。検証
npm run buildgreen既知の制約
border-strong6件は本変更外(テーマ既存課題)。