
2026/03/15 7:41
**Show HN:*GrobPaint* ― MS Paint と Paint.NET の中間地点に位置するアプリケーション
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約
GrobPaint は、Paint.NET が macOS をサポートしていないというギャップを埋めるために設計された軽量でクロスプラットフォームの画像編集ソフトウェアです。ペンシル、ブラシ、消しゴム、塗りつぶし、吸盤、線、四角形、楕円、テキスト、選択、マジックワンド、移動、回転、拡大縮小、ミラーなどの基本的な描画ツールと、完全な選択機能を備えており、すべて純粋な JavaScript(ES モジュール)で構築され、小さな Python バックエンドが付随しています。
主な特徴は次のとおりです:
- レイヤー管理:追加・削除・複製・マージ・並び替え、レイヤーごとの不透明度設定、および 16 のブレンドモード。
- ファイル I/O:PNG、JPEG、BMP、GIF を開いて保存。プロジェクトは GrobPaint 独自の
フォーマット(レイヤーと.gbp
を含む ZIP アーカイブ)で保存されます。manifest.json - マルチドキュメントタブインターフェース とクリップボード統合により、ユーザーは画像を新しいレイヤーとして直接貼り付けることができます。
- よく使われる操作のキーボードショートカット(Ctrl + N/O/S、Undo/Redo、Zoom、Grid 切替)やツール用ホットキー(ブラシサイズ、色スワップなど)。
コードベースは約 2,500 行の純粋な JavaScript で、コア・レンダラー・ツール・UI・アプリモジュールに分かれています。Python は簡易 HTTP サーバーと
pywebview を介したオプションのネイティブダイアログを提供します。npm のビルドステップやバンドラは不要で、ソースから python grobpaint.py で実行するか、PyInstaller によって生成されたスタンドアロンバイナリ(macOS アプリまたは Linux/Windows 実行ファイル)を起動します。任意の場合は、静的ファイルサーバーから直接エディタを配信できます。
ZIP 処理には CDN 経由で読み込むライブラリ JSZip だけが使用され、外部フレームワークや重い依存関係はありません。設計目標は、Photoshop のような大規模スイートのボリュームを持たずに、Windows、macOS、および Linux 上で高速かつリソース効率の良い編集ツールをユーザーと開発者に提供することです。
本文
MS Paint と Paint.NET の中間地点
デフォルトでマルチプラットフォーム対応。
Paint.NET は macOS では動作しないため、GrobPaint がそのギャップを埋めます。Web 技術と軽量 Python バックエンドで構築されたレイヤー付き画像編集ソフトです。目的は Paint.NET をクローンしたり Photoshop と競争することではなく、本当に必要なツールだけを余計な機能なしに提供することです。
主な特徴
| カテゴリ | 詳細 |
|---|---|
| レイヤー | 追加・削除・複製・統合・順序変更;レイヤーごとの不透明度と 16 種類のブレンドモード |
| ツール | ペンシル、ブラシ、消しゴム、塗りつぶし、吸い取り器、直線、四角形、楕円形、テキスト、選択、マジックワンド、移動、回転、拡大・縮小、ミラー |
| 選択 | 矩形とマジックワンド(許容度可設定);コピー/カット/ペースト;選択領域で切り抜き |
| カラー | HSV ピッカー、RGB / Hex 入力、アルファチャンネル;パレット(Lospec 500, PICO‑8)付き;プライマリ/セカンダリの入れ替え |
| キャンバス | ズーム(スクロールホイール・ピンチ・キーボード)、パン(スペース+ドラッグ、ミドルクリック、トラックパッド)、画面に合わせて表示、グリッドオーバレイ |
| ファイル I/O | PNG, JPEG, BMP, GIF;ネイティブ プロジェクト形式はレイヤーを ZIP アーカイブとして保存 |
| スプライトシート | シートをレイヤーに分割、またはレイヤーを横並びのシートとしてエクスポート |
| 画像操作 | スケール(最近傍・双線形・バイキュービック)、キャンバスリサイズ(アンカー付き)、反転、フラット化 |
| マルチドキュメント | タブ付きインターフェース;複数画像を同時に開くことが可能 |
| クリップボード | クリップボードから直接画像を新しいレイヤーとして貼り付け |
はじめ方
ソースから実行する場合
python grobpaint.py
pywebview を使ってネイティブウィンドウが起動します。pywebview が無いとデフォルトのブラウザに落ちます。
ブラウザモードを強制したい場合:
python grobpaint.py --browser
依存関係
- Python 3.9 以上
(オプション、ネイティブウィンドウ用) –pywebview
でインストールpip install pywebview
npm やビルドツールは不要です。フロントエンドは ES モジュールを使った純粋な JavaScript です。
スタンドアロンアプリの構築
PyInstaller を実行すると:
(macOS)dist/GrobPaint.app
(バイナリ)dist/GrobPaint/GrobPaint
ブラウザのみで利用する場合
index.html を直接開くか、任意の静的ファイルサーバーで配信します。ファイルダイアログは使用できませんが、ブラウザのファイル入力とダウンロードでオープン/セーブを行います。
キーボードショートカット
| ショートカット | 動作 |
|---|---|
| ブラシサイズ減少 / 増加 |
| プライマリ/セカンダリカラーの入れ替え |
| ズームイン / ズームアウト |
| 画面に合わせて表示 |
| 実寸(100 %) |
| 新規画像 |
| ファイルを開く |
| 上書き保存 |
| 名前を付けて保存 |
| 元に戻す / やり直し |
| コピー / カット / ペースト |
| すべて選択 / 選択解除 |
| グリッドの表示切替 |
| 選択領域を削除 |
| キャンバスをパン |
プロジェクト形式
.gbp ファイルは ZIP アーカイブで、以下の構成になっています。
manifest.json # 画像サイズ、レイヤー情報(名前・不透明度・表示状態・ブレンドモード) layers/ layer_0.png layer_1.png ...
アーキテクチャ
アプリは約 2500 行の純粋 JavaScript を 4 つのモジュールに分割して構築しています。
| ファイル | 役割 |
|---|---|
| EventBus、Layer、History(スワップベースの Undo/Redo)、PaintDocument、Selection |
| 合成エンジン、チェッカー ボード背景、ズーム・パン、グリッドオーバレイ |
| すべてのツール(フラッドフィル、フラッドセレクト、Bresenham の直線) |
| カラーシステム、HSV ピッカー、レイヤーパネル、ドキュメントタブ、メニュー、ダイアログ |
| アプリ初期化、キャンバスイベント、キーボードショートカット、ファイル I/O |
| Python HTTP サーバー + pywebview ランチャー、ネイティブファイルダイアログ |
フレームワークや重い依存は一切使用しておらず、ブラウザ側で
.gbp を扱うために JSZip を CDN から読み込むだけです。
謝辞
GrobPaint は Anthropic の Claude の大きな助けを受けて開発されました。