From 325081773bc882890ae11ce68ddfdb26b77dd3ae Mon Sep 17 00:00:00 2001 From: "ry.yamafuji" Date: Sat, 7 Jun 2025 22:21:18 +0900 Subject: [PATCH] =?UTF-8?q?=E7=94=BB=E5=83=8F=E3=81=AE=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/pg_task.md | 21 ++++++++------------- src/extension.ts | 23 +++++++++++++++++++++++ src/webviewContent.ts | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 24574fa..4a26628 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # imagemarkpengent -![alt text](readme/images/top.png) +![alt text](./readme/images/top.png) This is the README for your extension "imagemarkpengent". After writing up a brief description, we recommend including the following sections. diff --git a/docs/pg_task.md b/docs/pg_task.md index 76ac0d9..6ec5854 100644 --- a/docs/pg_task.md +++ b/docs/pg_task.md @@ -32,14 +32,16 @@ VSCode拡張機能「ImageMarkPengent」の実装タスク一覧です。 - [x] 対象拡張子を `.png` / `.jpg` / `.jpeg` に限定 ### 2. WebViewで画像表示 -- [ ] コマンド実行時にWebViewパネルを開く -- [ ] 画像ファイルを `` または `` で表示 -- [ ] 画像の上に描き込み可能な `canvas` を重ねる +- [x] コマンド実行時にWebViewパネルを開く +- [x] 画像ファイルを `` または `` で表示 +- [x] 画像の上に描き込み可能な `canvas` を重ねる + + ### 3. 赤丸マーク描画機能 -- [ ] WebView内でJavaScriptにより `` へ赤丸を描画 -- [ ] クリック座標を取得し、赤丸を描画・保持 -- [ ] 複数マークの描画・再描画に対応 +- [x] WebView内でJavaScriptにより `` へ赤丸を描画 +- [x] クリック座標を取得し、赤丸を描画・保持 +- [x] 複数マークの描画・再描画に対応 ### 4. 加工画像の保存機能 - [ ] WebViewに「保存」ボタンを設置 @@ -47,10 +49,3 @@ VSCode拡張機能「ImageMarkPengent」の実装タスク一覧です。 - [ ] `vscode.postMessage()` で拡張機能側に送信 - [ ] 拡張機能側でファイル保存(別名保存も対応) ---- - -## 今後の拡張案(任意) -- 番号付きマーカーや矢印の追加 -- マークの色やサイズ変更 -- Undo/Redo機能 -- 他画像フォーマット対応 \ No newline at end of file diff --git a/src/extension.ts b/src/extension.ts index 605b829..0ad4dc1 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -37,6 +37,29 @@ export function activate(context: vscode.ExtensionContext) { const imageSrc = panel.webview.asWebviewUri(uri); panel.webview.html = getWebviewContent(imageSrc.toString()); + + // WebViewからのメッセージ受信(保存処理) + panel.webview.onDidReceiveMessage(async (message) => { + if (message.type === 'save-image' && message.dataUrl) { + // ファイル保存ダイアログを表示 + const uriSave = await vscode.window.showSaveDialog({ + filters: { 'PNG Images': ['png'] }, + saveLabel: '画像として保存' + }); + if (!uriSave) return; + // dataUrlからbase64部分を抽出 + const base64 = message.dataUrl.replace(/^data:image\/png;base64,/, ''); + const buffer = Buffer.from(base64, 'base64'); + const fs = require('fs'); + fs.writeFile(uriSave.fsPath, buffer, (err: any) => { + if (err) { + vscode.window.showErrorMessage('画像の保存に失敗しました: ' + err.message); + } else { + vscode.window.showInformationMessage('画像を保存しました: ' + uriSave.fsPath); + } + }); + } + }); }); context.subscriptions.push(disposable); diff --git a/src/webviewContent.ts b/src/webviewContent.ts index 44c2c9f..a1e7fcb 100644 --- a/src/webviewContent.ts +++ b/src/webviewContent.ts @@ -30,6 +30,7 @@ export function getWebviewContent(imageSrc: string): string { +