MakiAi commited on
Commit
9100260
1 Parent(s): 2b5ca13

feat: pic-to-header の初期実装

Browse files

- pic_to_header/core.py: 画像処理機能の実装
- web_app/app.py: Streamlit アプリケーションの実装
- requirements.txt: 依存関係の更新
- README.md: プロジェクト説明の追加
- tests/test_core.py: ユニットテストの追加
- 不要なファイルの削除 (utils.py, index.html)

この実装により、マスク画像と入力画像からヘッダー画像を生成する基本機能が完成しました。

README.md CHANGED
@@ -1,245 +1,49 @@
1
- <p align="center">
2
- <img src="https://raw.githubusercontent.com/Sunwood-ai-labs/HarmonAI_III/refs/heads/main/docs/HarmonAI-III.png" width="100%">
3
- <h1 align="center">🌟 HarmonAI III 🌟</h1>
4
- </p>
5
-
6
- <p align="center">
7
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III">
8
- <img alt="GitHub Repo" src="https://img.shields.io/badge/github-HarmonAI__III-blue?logo=github">
9
- </a>
10
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/blob/main/LICENSE">
11
- <img alt="License" src="https://img.shields.io/github/license/Sunwood-ai-labs/HarmonAI_III?color=green">
12
- </a>
13
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/stargazers">
14
- <img alt="GitHub stars" src="https://img.shields.io/github/stars/Sunwood-ai-labs/HarmonAI_III?style=social">
15
- </a>
16
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/releases">
17
- <img alt="GitHub release" src="https://img.shields.io/github/v/release/Sunwood-ai-labs/HarmonAI_III?include_prereleases&style=flat-square">
18
- </a>
19
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/graphs/commit-activity">
20
- <img alt="GitHub commit activity" src="https://img.shields.io/github/commit-activity/m/Sunwood-ai-labs/HarmonAI_III">
21
- </a>
22
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/pulls">
23
- <img alt="PRs Welcome" src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square">
24
- </a>
25
- <img alt="GitHub repo size" src="https://img.shields.io/github/repo-size/Sunwood-ai-labs/HarmonAI_III">
26
- <img alt="Development Status" src="https://img.shields.io/badge/status-active-success.svg">
27
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/issues">
28
- <img alt="GitHub issues" src="https://img.shields.io/github/issues/Sunwood-ai-labs/HarmonAI_III">
29
- </a>
30
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/network/members">
31
- <img alt="GitHub forks" src="https://img.shields.io/github/forks/Sunwood-ai-labs/HarmonAI_III?style=social">
32
- </a>
33
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/watchers">
34
- <img alt="GitHub watchers" src="https://img.shields.io/github/watchers/Sunwood-ai-labs/HarmonAI_III?style=social">
35
- </a>
36
- <img alt="GitHub last commit" src="https://img.shields.io/github/last-commit/Sunwood-ai-labs/HarmonAI_III">
37
- <img alt="GitHub top language" src="https://img.shields.io/github/languages/top/Sunwood-ai-labs/HarmonAI_III">
38
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/graphs/contributors">
39
- <img alt="GitHub contributors" src="https://img.shields.io/github/contributors/Sunwood-ai-labs/HarmonAI_III">
40
- </a>
41
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/issues?q=is%3Aissue+is%3Aclosed">
42
- <img alt="GitHub closed issues" src="https://img.shields.io/github/issues-closed/Sunwood-ai-labs/HarmonAI_III">
43
- </a>
44
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/pulls?q=is%3Apr+is%3Aclosed">
45
- <img alt="GitHub closed PRs" src="https://img.shields.io/github/issues-pr-closed/Sunwood-ai-labs/HarmonAI_III">
46
- </a>
47
- <img alt="GitHub language count" src="https://img.shields.io/github/languages/count/Sunwood-ai-labs/HarmonAI_III">
48
- <img alt="GitHub search hit counter" src="https://img.shields.io/github/search/Sunwood-ai-labs/HarmonAI_III/goto">
49
- <img alt="GitHub code size" src="https://img.shields.io/github/languages/code-size/Sunwood-ai-labs/HarmonAI_III">
50
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/blob/main/CONTRIBUTING.md">
51
- <img src="https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg" alt="Contributor Covenant">
52
- </a>
53
- <a href="https://twitter.com/intent/tweet?text=Check%20out%20this%20awesome%20project%3A&url=https%3A%2F%2Fgithub.com%2FSunwood-ai-labs%2FHarmonAI_III">
54
- <img alt="Twitter" src="https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Fgithub.com%2FSunwood-ai-labs%2FHarmonAI_III">
55
- </a>
56
- <img alt="GitHub Created At" src="https://img.shields.io/github/created-at/Sunwood-ai-labs/HarmonAI_III">
57
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/deployments">
58
- <img alt="GitHub deployments" src="https://img.shields.io/github/deployments/Sunwood-ai-labs/HarmonAI_III/Production">
59
- </a>
60
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/discussions">
61
- <img alt="GitHub Discussions" src="https://img.shields.io/github/discussions/Sunwood-ai-labs/HarmonAI_III">
62
- </a>
63
- <img alt="GitHub followers" src="https://img.shields.io/github/followers/Sunwood-ai-labs?style=social">
64
- <img alt="GitHub Release Date" src="https://img.shields.io/github/release-date/Sunwood-ai-labs/HarmonAI_III">
65
- <img alt="GitHub commit activity (branch)" src="https://img.shields.io/github/commit-activity/y/Sunwood-ai-labs/HarmonAI_III/main">
66
- <img alt="GitHub commits since latest release (by date)" src="https://img.shields.io/github/commits-since/Sunwood-ai-labs/HarmonAI_III/latest">
67
-
68
-
69
- </a>
70
- </p>
71
-
72
- <p align="center">
73
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/actions/workflows/generate-release-notes.yml">
74
- <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Sunwood-ai-labs/HarmonAI_III/generate-release-notes.yml?label=generate-auto-release-notes">
75
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/actions/workflows/translate-readme.yml">
76
- <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Sunwood-ai-labs/HarmonAI_III/generate-release-notes.yml?label=auto-translate-readme">
77
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/actions/workflows/issue-review.yml">
78
- <img alt="GitHub Workflow Status" src="https://img.shields.io/github/actions/workflow/status/Sunwood-ai-labs/HarmonAI_III/generate-release-notes.yml?label=auto-issue-review">
79
- </p>
80
- <h2 align="center">
81
- ~ AI-Powered Automated Repository Management Template ~
82
-
83
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/blob/main/README.md"><img src="https://img.shields.io/badge/ドキュメント-日本語-white.svg" alt="JA doc"/></a>
84
- <a href="https://github.com/Sunwood-ai-labs/HarmonAI_III/blob/main/docs/README.en.md"><img src="https://img.shields.io/badge/english-document-white.svg" alt="EN doc"></a>
85
- </h2>
86
-
87
- > [!IMPORTANT]
88
- > HarmonAI IIIは、[cline (旧:Claude Dev)](https://github.com/clinebot/cline), [SourceSage](https://github.com/Sunwood-ai-labs/SourceSage), [claude.ai](https://claude.ai/)を活用して開発されたテンプレートリポジトリです。リリースノート、README、コミットメッセージの大部分は、最新のAI技術を用いて生成されています。
89
-
90
- ## 🚀 プロジェクト概要
91
-
92
- HarmonAI IIIは、AIRAとIRISを統合した革新的な**AIリポジトリスターターキット**です。このリポジトリは、LLMを活用したAI開発プロジェクトの構造とワークフローを提供し、開発者の作業効率を劇的に向上させることを目的としています。バージョン: `v1.2.0`
93
-
94
-
95
- ## 🆕 最新情報
96
-
97
- - 🎉 v1.2.0リリース: READMEへのGitHub Shieldsの追加、コラボレーター招待機能の追加、ドキュメントの更新を行いました。
98
-
99
-
100
- ## ✨ 主な機能
101
-
102
- 1. **統合AIツールセット**: AIRAとIRISの機能を1つのパッケージで提供
103
- 2. **即時利用可能**: テンプレートとして使用することで、高品質な初期構造を持つリポジトリを簡単に作成
104
- 3. **自動化された開発ワークフロー**: コミットメッセージ生成、リリースノート作成、イシュー管理の自動化
105
- 4. **多言語サポート**: READMEの自動翻訳機能により、国際的なプロジェクト展開をサポート
106
- 5. **柔軟なカスタマイズ**: プロジェクトのニーズに合わせて容易に調整可能
107
- 6. **コラボレーター自動招待**: GitHub APIを利用したコラボレーター招待スクリプト
108
-
109
-
110
- ## 🔧 使用方法
111
-
112
- ### AIRAの使用例:
113
- ```bash
114
- aira --mode sourcesage commit --config=.aira\config.dev.commit.yml --ss-model-name="gpt-4o-mini" --llm-output="llm_output.md"
115
- ```
116
-
117
- ### IRISの使用例:
118
-
119
- 詳細な使用方法については、各コンポーネントのドキュメンテーションを参照してください。
120
-
121
-
122
- ## 📦 インストール手順
123
-
124
- 1. このリポジトリをテンプレートとして使用し、新しいリポジトリを作成します。
125
- 2. リポジトリをローカルにクローンします。
126
- 3. 必要な依存関係をインストールします:
127
- ```bash
128
- pip install -r requirements.txt
129
- ```
130
- 4. AIRAとIRISの設定ファイルをカスタマイズします。
131
- 5. GitHub Actionsの設定を確認し、必要に応じて環境変数を設定します。
132
- 6. `.github/release_notes/.sourcesage_releasenotes_iris.yml`ファイルを開き、`repo-name:`の値を新しいリポジトリ名に修正します。
133
-
134
-
135
- ## 🌿 環境構築
136
-
137
- HarmonAI IIIの環境を構築するには、以下の手順に従ってください:
138
-
139
- 1. 仮想環境を作成します:
140
- ```bash
141
- python3 -m venv .venv
142
- ```
143
- これにより、`.venv`ディレクトリに仮想環境が作成されます。
144
-
145
- 2. 仮想環境をアクティベートします:
146
- ```bash
147
- source .venv/bin/activate # Linux/macOS
148
- .venv\Scripts\activate # Windows
149
- ```
150
-
151
- 3. 依存関係をインストールします:
152
- ```bash
153
- pip install -r requirements.txt
154
- ```
155
-
156
- これらの手順により、HarmonAI IIIの開発環境が整います。
157
-
158
-
159
- ## 📚 主要コンポーネント
160
 
161
- ### 🤖 [AIRA (AI-Integrated Repository for Accelerated Development)](https://github.com/Sunwood-ai-labs/AIRA)
162
- - リポジトリ作成の自動化
163
- - コミットメッセージの自動生成
164
 
165
- ### 🌈 [IRIS (Intelligent Repository Issue Solver)](https://github.com/Sunwood-ai-labs/IRIS)
166
- - イシューの自動分類
167
- - 解決策の自動提案
168
- - リリースノートの自���生成
169
- - READMEの自動翻訳
170
 
171
- ## 🤝 コラボレーターの自動招待
 
 
172
 
173
- HarmonAI IIIには、GitHubリポジトリにコラボレーターを自動で招待するスクリプトが含まれています。以下の手順で使用できます:
174
 
175
- 1. `.env` ファイルを作成し、必要なトークンを設定します:
176
- ```
177
- # GitHubアクセストークン(コラボレーター招待用)
178
- GITHUB_TOKEN=your_github_personal_access_token_here
179
 
180
- # 以下は他の機能で使用する可能性のあるトークンの例です。記載しておくと後々便利です。
181
- # GITHUB_ACCESS_TOKEN=ghp_xxxxx
182
- # YOUR_PERSONAL_ACCESS_TOKEN_IRIS=ghp_yyyyy
183
- # GEMINI_API_KEY=AIzzzzz
184
- ```
185
-
186
- 注意: `.env` ファイルは `.gitignore` に含めて、リポジトリにコミットしないようにしてください。
187
-
188
- 2. 以下のコマンドを実行してコラボレーターを招待します:
189
- ```bash
190
- python .github/github_add_collaborator.py Sunwood-ai-labs/HarmonAI_III username_to_invite
191
- ```
192
-
193
- `username_to_invite` は招待したいGitHubユーザー名に置き換えてください。
194
-
195
- 3. スクリプトが正常に実行されると、指定したユーザーにコラボレーター招待が送信されます。
196
-
197
- 注意事項:
198
- - このスクリプトを使用するには、GitHubトークンに適切な権限(`repo` スコープ)が必要です。
199
- - 組織のリポジトリに対して使用する場合は、組織の設定で適切な権限が付与されていることを確認してください。
200
- - セキュリティのため、トークンは定期的に更新し、必要最小限の権限のみを付与するようにしてください。
201
- - `.env` ファイルやトークンを含む情報は、決して公開リポジトリにコミットしないでください。
202
-
203
- この機能により、プロジェクトへの新しいコントリビューターの追加プロセスが簡素化されます。セキュリティを維持しながら、効率的にチームを拡大することができます。
204
-
205
- ## 🐈 処理フロー
206
 
 
207
 
208
- ```mermaid
209
- %%{init:{'theme':'base','themeVariables':{'primaryColor':'#024959','primaryTextColor':'#F2C335','primaryBorderColor':'#F2AE30','lineColor':'#A1A2A6','secondaryColor':'#593E25','tertiaryColor':'#F2C335','noteTextColor':'#024959','noteBkgColor':'#F2C335','textColor':'#024959','fontSize':'18px'}}}%%
 
210
 
211
- graph LR
212
- A[開始] --> B[リポジトリの構想とネーミング]
213
- B -->|人間が実施| C[HarmonAI IIIによる<br>リポジトリ初期化]
214
- C -->|自動化| D[開発作業]
215
- D -->|人間が実施| E[AIRAによる<br>コミット自動化]
216
- E --> H[IRISによる<br>リリースノート作成]
217
- H --> I[IRISによる<br>ドキュメント翻訳]
218
- I --> J[リリース]
219
- J --> K[終了]
220
 
221
- class B,D,G human;
222
- class E aira;
223
- class F,H,I iris;
224
- class C auto;
225
- class A,J,K process;
226
 
 
 
227
  ```
228
 
 
229
 
 
230
 
231
- ## 🤝 コントリビューション
232
-
233
- HarmonAI IIIは、オープンソースプロジェクトとしてコミュニティからの貢献を歓迎しています。バグ報告、機能リクエスト、プルリクエストを通じて、このテンプレートリポジトリの改善にご協力ください。
234
-
235
- ## 📄 ライセンス
236
 
237
- HarmonAI IIIは、[MITライセンス](LICENSE)の下で公開されています。
238
 
239
- ## 🙏 謝辞
240
 
241
- HarmonAI IIIの開発にあたり、多くのオープンソースプロジェクトからインスピレーションを得ています。特に、AIRAとIRISの開発者の皆様に深く感謝申し上げます。iris-s-coon、Maki様にも感謝いたします。
 
242
 
243
- ---
244
 
245
- HarmonAI IIIは、AI駆動の開発プロセスを実現する優れたスターターキットです。このテンプレートを基に、革新的なAIプロジェクトの開発を始めましょう!
 
1
+ # Pic-to-Header
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
+ Pic-to-Headerは、マスク画像と入力画像を使用してヘッダー画像を生成するPythonアプリケーションです。
 
 
4
 
5
+ ## 機能
 
 
 
 
6
 
7
+ - マスク画像と入力画像をアップロード
8
+ - 入力画像にマスクを適用してヘッダー画像を生成
9
+ - 生成されたヘッダー画像のプレビューとダウンロード
10
 
11
+ ## インストール
12
 
13
+ 1. リポジトリをクローンします:
 
 
 
14
 
15
+ ```
16
+ git clone https://github.com/yourusername/pic-to-header.git
17
+ cd pic-to-header
18
+ ```
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
+ 2. 必要な依存関係をインストールします:
21
 
22
+ ```
23
+ pip install -r requirements.txt
24
+ ```
25
 
26
+ ## 使用方法
 
 
 
 
 
 
 
 
27
 
28
+ 1. Streamlitアプリケーションを起動します:
 
 
 
 
29
 
30
+ ```
31
+ streamlit run web_app/app.py
32
  ```
33
 
34
+ 2. ブラウザで表示されるURLにアクセスします。
35
 
36
+ 3. 入力画像とマスク画像をアップロードします。
37
 
38
+ 4. "ヘッダー画像を生成"ボタンをクリックします。
 
 
 
 
39
 
40
+ 5. 生成されたヘッダー画像をプレビューし、必要に応じてダウンロードします。
41
 
42
+ ## 開発
43
 
44
+ - `pic_to_header/core.py`: 画像処理の主要な機能を含みます。
45
+ - `web_app/app.py`: Streamlitを使用したWebインターフェースを提供します。
46
 
47
+ ## ライセンス
48
 
49
+ このプロジェクトはMITライセンスの下で公開されています。詳細については、[LICENSE](LICENSE)ファイルを参照してください。
pic_to_header/__init__.py ADDED
File without changes
pic_to_header/core.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import cv2
2
+ import numpy as np
3
+
4
+ def process_header_image(input_image_path, mask_image_path, output_image_path):
5
+ # 入力画像を読み込む
6
+ input_image = cv2.imread(input_image_path, cv2.IMREAD_UNCHANGED)
7
+
8
+ # マスク画像を読み込み、グレースケールに変換
9
+ mask_image = cv2.imread(mask_image_path, cv2.IMREAD_GRAYSCALE)
10
+
11
+ # マスク画像を入力画像と同じサイズにリサイズ
12
+ mask_image = cv2.resize(mask_image, (input_image.shape[1], input_image.shape[0]))
13
+
14
+ # 入力画像にアルファチャンネルがない場合は追加
15
+ if input_image.shape[2] == 3:
16
+ input_image = cv2.cvtColor(input_image, cv2.COLOR_BGR2BGRA)
17
+
18
+ # マスクを適用
19
+ input_image[:, :, 3] = mask_image
20
+
21
+ # 結果を保存
22
+ cv2.imwrite(output_image_path, input_image)
23
+
24
+ return output_image_path
requirements.txt CHANGED
@@ -1,2 +1,3 @@
1
- aira
2
- sourcesage
 
 
1
+ opencv-python==4.5.5.64
2
+ numpy==1.21.5
3
+ streamlit==1.10.0
tests/__init__.py ADDED
File without changes
tests/test_core.py ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import unittest
2
+ import os
3
+ import cv2
4
+ import numpy as np
5
+ from pic_to_header.core import process_header_image
6
+
7
+ class TestCore(unittest.TestCase):
8
+ def setUp(self):
9
+ self.input_image_path = 'test_input.png'
10
+ self.mask_image_path = 'test_mask.png'
11
+ self.output_image_path = 'test_output.png'
12
+
13
+ # テスト用の入力画像を作成
14
+ input_image = np.ones((100, 100, 3), dtype=np.uint8) * 255
15
+ cv2.imwrite(self.input_image_path, input_image)
16
+
17
+ # テスト用のマスク画像を作成
18
+ mask_image = np.zeros((100, 100), dtype=np.uint8)
19
+ mask_image[25:75, 25:75] = 255
20
+ cv2.imwrite(self.mask_image_path, mask_image)
21
+
22
+ def tearDown(self):
23
+ # テスト用のファイルを削除
24
+ for file in [self.input_image_path, self.mask_image_path, self.output_image_path]:
25
+ if os.path.exists(file):
26
+ os.remove(file)
27
+
28
+ def test_process_header_image(self):
29
+ # process_header_image 関数をテスト
30
+ result = process_header_image(self.input_image_path, self.mask_image_path, self.output_image_path)
31
+
32
+ # 出力ファイルが作成されたことを確認
33
+ self.assertTrue(os.path.exists(self.output_image_path))
34
+
35
+ # 出力画像を読み込み
36
+ output_image = cv2.imread(self.output_image_path, cv2.IMREAD_UNCHANGED)
37
+
38
+ # 出力画像が正しいサイズであることを確認
39
+ self.assertEqual(output_image.shape[:2], (100, 100))
40
+
41
+ # アルファチャンネルが正しく適用されていることを確認
42
+ self.assertEqual(output_image.shape[2], 4) # BGRAチャンネル
43
+
44
+ # マスクが正しく適用されていることを確認
45
+ np.testing.assert_array_equal(output_image[25:75, 25:75, 3], 255)
46
+ np.testing.assert_array_equal(output_image[:25, :, 3], 0)
47
+ np.testing.assert_array_equal(output_image[75:, :, 3], 0)
48
+ np.testing.assert_array_equal(output_image[:, :25, 3], 0)
49
+ np.testing.assert_array_equal(output_image[:, 75:, 3], 0)
50
+
51
+ if __name__ == '__main__':
52
+ unittest.main()
web_app/__init__.py ADDED
File without changes
web_app/app.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import os
3
+ from pic_to_header.core import process_header_image
4
+
5
+ def main():
6
+ st.title("Pic-to-Header")
7
+ st.write("マスク画像と入力画像をアップロードして、ヘッダー画像を生成します。")
8
+
9
+ input_image = st.file_uploader("入力画像をアップロード", type=["png", "jpg", "jpeg"])
10
+ mask_image = st.file_uploader("マスク画像をアップロード", type=["png", "jpg", "jpeg"])
11
+
12
+ if input_image is not None and mask_image is not None:
13
+ if st.button("ヘッダー画像を生成"):
14
+ # 一時ファイルとして保存
15
+ input_path = f"temp_input.{input_image.name.split('.')[-1]}"
16
+ mask_path = f"temp_mask.{mask_image.name.split('.')[-1]}"
17
+ output_path = "output_header.png"
18
+
19
+ with open(input_path, "wb") as f:
20
+ f.write(input_image.getbuffer())
21
+ with open(mask_path, "wb") as f:
22
+ f.write(mask_image.getbuffer())
23
+
24
+ # 画像処理
25
+ process_header_image(input_path, mask_path, output_path)
26
+
27
+ # 結果を表示
28
+ st.image(output_path, caption="生成されたヘッダー画像")
29
+
30
+ # ダウンロードボタンを追加
31
+ with open(output_path, "rb") as file:
32
+ btn = st.download_button(
33
+ label="ヘッダー画像をダウンロード",
34
+ data=file,
35
+ file_name="header_image.png",
36
+ mime="image/png"
37
+ )
38
+
39
+ # 一時ファイルを削除
40
+ os.remove(input_path)
41
+ os.remove(mask_path)
42
+ os.remove(output_path)
43
+
44
+ if __name__ == "__main__":
45
+ main()