[中文](README.md) | [English](README_EN.md) | **[日本語](README_JA.md)** # スクリーンショット&クリップボード管理ソフト — jietuba ## 概要 PySide6 and RUSTベースのスクリーンショットおよびクリップボード管理アプリケーションです。領域キャプチャ、ウィンドウスマート検出、GIF録画、長いスクリーンショットの結合、OCR文字認識、画像ピン留め、翻訳機能を備え、完全なクリップボード履歴管理システムを搭載しています。 --- ## インストール手順 本プロジェクトは4つの自作Rustライブラリに依存しています。**プログラムを実行する前に、必ずこれらのパッケージをインストールしてください。** ### 1. Python 3.11 仮想環境の作成と有効化 ```bash python -m venv venv311 # Windows: venv311\Scripts\activate ``` ### 2. Python依存パッケージのインストール ```bash python -m pip install --upgrade pip python -m pip install -r requirements.txt ``` ### 3. 自作Rustパッケージのインストール(必須) プロジェクトルートで次のコマンドを実行してください: ```bash python -m pip install gifrecorder-0.2.1-cp311-cp311-win_amd64.whl longstitch-0.3.11-cp311-cp311-win_amd64.whl pyclipboard-0.3.14-cp311-cp311-win_amd64.whl ppocr_rust-0.1.1-cp311-cp311-win_amd64.whl ``` | パッケージ名 | バージョン | 機能 | |-------------|-----------|------| | `gifrecorder` | 0.2.1 | GIF/動画合成エンコーダー | | `longstitch` | 0.3.11 | 長いスクリーンショット結合アルゴリズム | | `pyclipboard` | 0.3.14 | クリップボード操作 | | `ppocr_rust` | 0.1.1 | PP-OCR (PaddleOCR) ONNX 文字認識エンジン(純 Rust + ONNX Runtime、det/rec モデルが必要) | > **注意:** これらの `.whl` ファイルは Windows x86_64 + Python 3.11 専用です。グローバルPython環境にはインストールしないでください。 > **OCR モデル:** `ppocr_rust` は `models/` フォルダ内の PP-OCR ONNX モデル(`PP-OCRv6_det_small.onnx` + `PP-OCRv6_rec_small.onnx`)が必要です。リポジトリに同梱済み。パッケージ化後は `models/` を exe と同じ階層に配置してください。 **開発/ビルド依存(任意):** ```bash python -m pip install -r requirements-dev.txt ``` ### 4. プログラムの実行 ```bash cd main python main_app.py ``` --- ## ディレクトリ構造 ``` # プロジェクトルート ├── README.md / README_EN.md / README_JA.md # 中国語・英語・日本語ドキュメント ├── pyproject.toml # Pythonプロジェクトのメタデータと依存関係 ├── requirements.txt # 実行時依存パッケージ ├── requirements-dev.txt # テスト・ビルド用依存パッケージ ├── build_with_ocr_onefile.py # PyInstaller単一ファイルビルドスクリプト ├── gifrecorder-0.2.1-cp311-cp311-win_amd64.whl # GIF録画 Rustビルド済みパッケージ ├── longstitch-0.3.11-cp311-cp311-win_amd64.whl # 長いスクリーンショット Rustビルド済みパッケージ ├── pyclipboard-0.3.14-cp311-cp311-win_amd64.whl # クリップボード Rustビルド済みパッケージ ├── ppocr_rust-0.1.1-cp311-cp311-win_amd64.whl # OCR Rustビルド済みパッケージ │ ├── main/ # Python メインプログラム │ ├── main_app.py # アプリエントリポイント:システムトレイ、グローバルホットキー、ライフサイクル管理 │ ├── compile_translations.py # 翻訳コンパイラ(.xml → .qm) │ │ │ ├── canvas/ # キャンバスモジュール — グラフィックス編集コア │ ├── capture/ # キャプチャモジュール — スクリーンキャプチャ&ウィンドウ検出 │ ├── clipboard/ # クリップボードモジュール — 履歴、グループ/クイック起動、入出力、検索 │ ├── core/ # コアモジュール — ブートストラップ、ログ、リソース、テーマ、i18n、ホットキー │ ├── gif/ # GIFモジュール — 画面録画、編集、再生、エクスポート │ ├── ocr/ # OCRモジュール — PP-OCR 文字認識 │ ├── pin/ # ピンモジュール — スクリーンショットピン留め、編集、OCR、翻訳 │ ├── settings/ # 設定モジュール — 統一設定管理 │ ├── stitch/ # 結合モジュール — スクロールキャプチャ、自動結合 │ ├── tools/ # ツールモジュール — ペン、矩形、矢印、テキスト等 │ ├── translation/ # 翻訳モジュール — DeepL APIサービス │ ├── translations/ # 言語リソース — 中国語/英語/日本語/韓国語 │ ├── ui/ # UIモジュール — 共通UIコンポーネントライブラリ │ └── tests/ # テストモジュール — ユニットテスト&統合テスト │ ├── rust_libs/ # Rustライブラリソースコード(ソースからビルド可能) │ ├── gifrecorder/ # GIF/動画合成エンコーダーソース │ ├── longstitch/ # 長いスクリーンショット結合アルゴリズムソース │ ├── pyclipboard/ # クリップボード低レベル操作ソース │ └── ppocr_rust/ # PP-OCR (PaddleOCR) ONNX 認識エンジンソース │ ├── models/ # PP-OCR ONNX モデル(OCR に必須) │ ├── PP-OCRv6_det_small.onnx # テキスト検出モデル (DBNet) │ └── PP-OCRv6_rec_small.onnx # テキスト認識モデル (CRNN/CTC) │ └── svg/ # SVGアイコンリソース ``` --- ## モジュール詳細 ### canvas/ — キャンバスモジュール シーン管理、ビューレンダリング、アイテム選択、アンドゥ/リドゥ機能を備えたグラフィックス編集キャンバスシステム。 ![jietuba_gif_20260404_000903](https://github.com/user-attachments/assets/5318b991-b0de-46a2-9c0e-d75eeae2a827) ``` canvas/ ├── scene.py # CanvasScene — QGraphicsScene継承のキャンバスシーン ├── view.py # CanvasView — QGraphicsView継承のキャンバスビュー ├── selection_model.py # SelectionModel — 選択グラフィックスアイテムの管理 ├── undo.py # CommandUndoStack — アンドゥ/リドゥスタック ├── smart_edit_controller.py # SmartEditController — 選択/編集モード切替 ├── handle_editor.py # LayerEditor / EditHandle — コントロールポイントドラッグ編集 └── items/ ├── drawing_items.py # StrokeItem / RectItem / EllipseItem / ArrowItem / TextItem / NumberItem ├── background_item.py # BackgroundItem — 選択領域の背景 └── selection_item.py # SelectionItem — 選択境界表示 ``` --- ### capture/ — キャプチャモジュール スクリーンキャプチャとスマートウィンドウ検出。 ``` capture/ ├── capture_service.py # CaptureService — スクリーンショットコアロジック └── window_finder.py # WindowFinder — スマートウィンドウ選択、カーソル位置検出 ``` --- ### clipboard/ — クリップボード管理モジュール Ditto風のクリップボード履歴マネージャーで、controllers・core・services・ui の4層構成に再編されています。 テキスト、画像、HTML、ファイルに対応し、グループと内容を管理する独立した3ペイン管理ウィンドウも備えています。 ![jietuba_gif_20260404_001128](https://github.com/user-attachments/assets/b0a116e8-d944-43c9-b895-e6fc10d8c08a) ``` clipboard/ ├── __init__.py ├── controllers/ # 制御層 — 履歴読み込み、貼り付け処理、メニュー、選択状態 │ ├── clipboard_controller.py # ClipboardController — 読み込み、貼り付け、コンテキストメニュー │ ├── selection_manager.py # SelectionManager — リスト選択状態管理 │ └── __init__.py ├── core/ # データ層 — pyclipboard ラッパー、モデル、グループ種別 │ ├── manager.py # ClipboardManager — 保存、監視、貼り付け API │ ├── models.py # ClipboardItem / Group データモデル │ ├── enums.py # GroupType 定義 │ └── __init__.py ├── services/ # サービス層 — file payload、グループ規則、入出力、保存ロジック │ ├── file_payload_service.py # file 型 JSON payload と旧形式互換 │ ├── group_service.py # グループのアイコン・命名・削除確認補助 │ ├── import_export_service.py # テキスト項目の CSV インポート/エクスポート │ └── manage_dialog_service.py # 管理ウィンドウの保存ロジック ├── ui/ │ ├── dialogs/ │ │ └── manage_dialog.py # グループ・内容・入出力を扱う3ペイン管理ウィンドウ │ ├── forms/ │ │ ├── group_form.py │ │ ├── text_content_form.py │ │ ├── file_content_form.py │ │ ├── import_export_form.py │ │ └── group_icon_picker.py │ ├── mixins/ │ │ └── frameless_mixin.py │ ├── panels/ │ │ └── setting_panel.py │ ├── resources/ │ │ └── emoji_data.py │ ├── theme/ │ │ ├── themes.py │ │ └── theme_styles.py │ ├── widgets/ │ │ ├── draggable_list_widget.py │ │ ├── group_bar.py │ │ ├── item_delegate.py │ │ ├── item_widget.py │ │ └── preview_popup.py │ └── windows/ │ ├── clipboard_window.py # 履歴ウィンドウ、検索、プレビュー、高速貼り付け │ └── pin_window.py # 履歴項目からピンを作成 ``` **主な機能:** - システムクリップボードの変更を監視し、自動で履歴を保存 - テキスト、画像、HTML、ファイル等に対応 - 通常グループ、クイック起動グループ、お気に入り、検索に対応 - 独立した3ペイン管理ウィンドウでグループ・テキスト内容・ファイル内容を編集可能 - テキスト項目の CSV インポート/エクスポートに対応 - テーマ切替、ショートカットによる高速貼り付け、大画像/長文プレビューに対応 --- ### core/ — コアモジュール ログ、リソースローディング、テーマ管理、国際化、ホットキー等のインフラ。 ``` core/ ├── bootstrap.py # PreloadManager — 起動ブートストラップ、環境初期化、DPI、シングルインスタンス ├── logger.py # Logger — ファイル+コンソールログ(debug/info/warning/error/exception) ├── crash_handler.py # install_crash_hooks() — グローバル例外キャッチ ├── resource_manager.py # ResourceManager — SVG/画像リソースローディング ├── theme.py # ThemeManager — アプリテーマカラー管理 ├── i18n.py # I18nManager / XmlTranslator / tr() — 国際化 ├── shortcut_manager.py # HotkeySystem / ShortcutManager — グローバル&アプリ内ホットキー ├── save.py # SaveService — ファイル保存サービス ├── export.py # ExportService — 画像エクスポート ├── clipboard_utils.py # copy_image_to_clipboard() — 画像をクリップボードにコピー ├── platform_utils.py # DPI設定、AppUserModelID、Windows APIユーティリティ ├── qt_utils.py # safe_disconnect() — Qtシグナル安全切断 └── constants.py # グローバル定数(フォント、パス等) ``` --- ### gif/ — GIF録画モジュール 画面録画、編集、再生、GIF/動画エクスポート。 image ``` gif/ ├── record_window.py # GifRecordWindow / AppState — ステートマシンコーディネーター(3層ウィンドウ) ├── overlay.py # CaptureOverlay / OverlayMode — キャプチャオーバーレイ、領域調整 ├── drawing_view.py # GifDrawingView / GifDrawingScene — 録画中描画 ├── drawing_toolbar.py # GifDrawingToolbar — 描画ツールバー ├── record_toolbar.py # RecordToolbar — 開始/一時停止/停止コントロール ├── frame_recorder.py # FrameRecorder / FrameData / CursorSnapshot — フレームサンプリング ├── playback_engine.py # PlaybackEngine / PlayState — フレーム再生&プレビュー ├── playback_controller.py # PlaybackController — 再生UI&エクスポート管理 ├── playback_toolbar.py # PlaybackToolbar / RangeSlider — プログレスバー、速度調整 ├── composer.py # _ComposeWorker / ComposerProgressDialog — GIF/動画合成 ├── cursor_overlay.py # CursorOverlay — カーソルレンダリング&クリックアニメーション └── _widgets.py # ClickMenuButton / svg_icon() — カスタムウィジェット ``` --- ### ocr/ — OCRモジュール PP-OCR による文字認識管理。 image ``` ocr/ └── ocr_manager.py # OCRManager — ppocr_rust (PP-OCR) による文字認識 ``` - ppocr_rust エンジン(純 Rust + ONNX Runtime、PP-OCR det + rec)を使用。推論はネイティブスレッドで実行され UI をブロックしない - 中国語/英語/日本語認識 - シングルトンパターン、統一認識インターフェース --- ### pin/ — ピンモジュール スクリーンショットを画面にピン留め。編集、ズーム、OCR、翻訳対応。 image ``` pin/ ├── pin_window.py # PinWindow — ドラッグ可能、ズーム可能、常に最前面の画像ウィンドウ ├── pin_canvas_view.py # PinCanvasView — ピンキャンバスビュー ├── pin_canvas.py # ピンキャンバスオブジェクト ├── pin_manager.py # PinManager — 全ピンウィンドウ管理(シングルトン) ├── pin_toolbar.py # PinToolbar — ピンツールバー ├── pin_controls.py # PinControlButtons — 閉じる、編集、コピーボタン ├── pin_context_menu.py # PinContextMenu — 右クリックメニュー ├── pin_border_overlay.py # PinBorderOverlay — ボーダーエフェクトオーバーレイ ├── pin_ocr_manager.py # PinOCRManager / _OCRThread — 非同期OCR認識 ├── pin_shortcut.py # PinShortcutController — 通常/編集モードショートカット ├── pin_thumbnail.py # PinThumbnailMode — サムネイルモード ├── pin_translation.py # PinTranslationHelper — 翻訳ヘルパー ├── pin_image_transform.py # PinImageTransform — 回転、反転等 └── ocr_text_layer.py # OCRTextLayer / OCRTextItem — OCRテキストレイヤー表示 ``` --- ### settings/ — 設定モジュール ``` settings/ └── tool_settings.py # ToolSettingsManager / ToolSettings — ツールの色、サイズ、ホットキー設定 ``` --- ### stitch/ — 長いスクリーンショット結合モジュール ![jietuba_gif_20260404_001930](https://github.com/user-attachments/assets/a9720f08-5128-447d-b425-6d0640272e6a) ``` stitch/ ├── jietuba_long_stitch.py # コア結合アルゴリズム ├── jietuba_long_stitch_unified.py # 統一結合インターフェース ├── scroll_window.py # ScrollCaptureWindow — スクロールキャプチャウィンドウ └── scroll_toolbar.py # スクロールキャプチャツールバー ``` --- ### tools/ — 描画ツールモジュール ``` tools/ ├── base.py # Tool / ToolContext — 抽象基底クラス ├── controller.py # ToolController — ツール切替&状態管理 ├── action.py # ActionTools — コピー、保存、キャンセルアクション ├── pen.py # PenTool — フリーハンド描画 ├── rect.py # RectTool — 矩形(塗りつぶし/アウトライン) ├── ellipse.py # EllipseTool — 楕円 ├── arrow.py # ArrowTool — 矢印 ├── text.py # TextTool — テキスト ├── number.py # NumberTool — 自動インクリメント番号 ├── highlighter.py # HighlighterTool — 蛍光ペン/モザイク ├── cursor.py # CursorTool — カーソル/選択 ├── eraser.py # EraserTool — 消しゴム └── cursor_manager.py # CursorManager — カーソルスタイル管理 ``` --- ### translation/ — 翻訳モジュール DeepL APIベースのテキスト翻訳。 ``` translation/ ├── deepl_service.py # DeepLService / TranslationThread — 非同期DeepL API呼び出し ├── languages.py # SupportedLanguages — DeepL対応言語リスト・言語コード ├── translation_manager.py # TranslationManager — 翻訳ウィンドウマネージャー(シングルトン) ├── translation_dialog.py # TranslationDialog — 翻訳結果ウィンドウ └── ui/ ├── dialog.py # 翻訳ダイアログUI └── widgets.py # 翻訳ウィジェット ``` --- ### translations/ — 言語リソース ``` translations/ ├── app_zh.xml / app_zh.qm # 中国語 ├── app_en.xml / app_en.qm # 英語 └── app_ja.xml / app_ja.qm # 日本語 ``` `.xml` = 編集可能なソースファイル、`.qm` = Qtランタイムで読み込むコンパイル済みファイル。変更後は `compile_translations.py` を実行して再コンパイルしてください。 --- ### ui/ — UIモジュール 共通UIコンポーネントライブラリ。 ``` ui/ ├── toolbar.py # Toolbar / _DragHandle — ドラッグ可能なツールバー基底クラス ├── screenshot_window.py # ScreenshotWindow — フルスクリーンキャプチャウィンドウ ├── dialogs.py # StandardDialog — 確認、警告、情報、エラーダイアログ ├── magnifier.py # MagnifierOverlay — ピクセルレベル拡大鏡 ├── color_picker_dialog.py # ColorPickerDialog — カスタムHSVカラーピッカー ├── color_picker_button.py # ColorPickerButton — カラー選択ボタン ├── hotkey_edit.py # HotkeyEdit — グローバルホットキーエディター ├── inapp_key_edit.py # InAppKeyEdit — アプリ内ショートカットエディター ├── mask_overlay.py # マスクオーバーレイヤー ├── base_settings_panel.py # BaseSettingsPanel / StepperWidget — 設定パネル基底クラス ├── paint_settings_panel.py # PaintSettingsPanel — ブラシ設定パネル ├── shape_settings_panel.py # ShapeSettingsPanel — 形状設定パネル ├── text_settings_panel.py # TextSettingsPanel — テキスト設定パネル ├── arrow_settings_panel.py # ArrowSettingsPanel — 矢印設定パネル ├── number_settings_panel.py # 番号ツール設定パネル │ ├── settings_ui/ # アプリ設定ダイアログ │ ├── dialog.py # SettingsDialog — タブ式設定ダイアログ │ ├── components.py # SettingCardGroup / ToggleSwitch — 設定コンポーネント │ ├── page_appearance.py # 外観設定(テーマ、言語) │ ├── page_capture.py # キャプチャ設定 │ ├── page_clipboard.py # クリップボード設定 │ ├── page_hotkey.py # ホットキー設定 │ ├── page_translation.py # 翻訳設定 │ ├── page_log.py # ログ設定 │ ├── page_developer.py # 開発者設定 │ ├── page_misc.py # その他設定 │ ├── page_about.py # アバウトページ │ └── mock_config.py # MockConfig — テスト用モック設定 │ ├── welcome/ # 初回起動ウェルカムウィザード(6ページガイド) │ ├── wizard.py # WelcomeWizard — ウィザードメインウィンドウ │ ├── base_page.py # BasePage — ウィザードページ基底クラス │ ├── page1_welcome.py # ウェルカムページ │ ├── page2_screenshot.py # スクリーンショットホットキー設定ページ │ ├── page3_clipboard.py # クリップボードホットキー設定ページ │ ├── page4_smart_select.py # スマート選択説明ページ │ ├── page5_translation.py # 翻訳機能説明ページ │ └── page6_finish.py # 完了ページ │ └── selection_info/ # 選择情報UI ├── controller.py # 選择情報コントローラー ├── panel.py # 選择情報パネル(サイズ、座標) ├── hook_manager.py # フックマネージャー ├── border_shadow.py # 選择ボーダーシャドウエフェクト ├── lock_ratio.py # アスペクト比ロック └── rounded_corners.py # 角丸スクリーンショット ``` --- ### tests/ — テストモジュール ``` tests/ ├── conftest.py # pytest設定&共通フィクスチャ ├── pytest.ini # pytest実行設定 ├── run_tests.py # テスト実行スクリプト ├── test_undo_stack.py # アンドゥスタックテスト ├── test_selection_model.py # 選择モデルテスト ├── test_clipboard_api.py # クリップボード公開 API テスト ├── test_clipboard_data.py # クリップボードデータテスト ├── test_clipboard_manage_dialog.py # クリップボード管理ウィンドウテスト ├── test_clipboard_services.py # クリップボードサービス層テスト ├── test_clipboard_themes.py # クリップボードテーマテスト ├── test_clipboard_utils.py # クリップボードユーティリティテスト ├── test_core_utils.py # コアユーティリティテスト ├── test_crash_handler.py # クラッシュハンドラーテスト ├── test_emoji_data.py # 絵文字データテスト ├── test_gif_data.py # GIFデータ構造テスト ├── test_i18n.py # 国際化テスト ├── test_resource_manager.py # リソースマネージャーテスト ├── test_save_service.py # 保存サービステスト ├── test_stitch_algorithm.py # 結合アルゴリズムテスト ├── test_theme_manager.py # テーママネージャーテスト ├── test_tool_settings.py # ツール設定テスト └── test_tools_base.py # ツール基底クラステスト ```