File size: 4,978 Bytes
9100260
c31dc22
 
 
 
 
9100260
 
c31dc22
 
c014942
c31dc22
 
 
 
c014942
c31dc22
c014942
c31dc22
 
 
c014942
c31dc22
 
 
 
 
c014942
c31dc22
9100260
 
c31dc22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9100260
c31dc22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9100260
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import streamlit as st
from PIL import Image
import numpy as np
from modules.image_processor import process_image, prepare_image, convert_to_pil
from modules.mask_manager import MaskManager
from modules.utils import create_download_button

def main():
    # ワイドモードの設定
    st.set_page_config(layout="wide")

    st.markdown("""
    <div align="center">
    
    # Pic-to-Header

    <img src="https://raw.githubusercontent.com/Sunwood-ai-labs/pic-to-header/refs/heads/main/assets/result.png" width="50%">

    [![GitHub license](https://img.shields.io/github/license/Sunwood-ai-labs/pic-to-header)](https://github.com/Sunwood-ai-labs/pic-to-header/blob/main/LICENSE)
    [![GitHub stars](https://img.shields.io/github/stars/Sunwood-ai-labs/pic-to-header)](https://github.com/Sunwood-ai-labs/pic-to-header/stargazers)
    [![GitHub issues](https://img.shields.io/github/issues/Sunwood-ai-labs/pic-to-header)](https://github.com/Sunwood-ai-labs/pic-to-header/issues)

    ![Python](https://img.shields.io/badge/python-3670A0?style=for-the-badge&logo=python&logoColor=ffdd54)
    ![Streamlit](https://img.shields.io/badge/Streamlit-FF4B4B?style=for-the-badge&logo=Streamlit&logoColor=white)
    ![OpenCV](https://img.shields.io/badge/opencv-%23white.svg?style=for-the-badge&logo=opencv&logoColor=white)
    </div>
    """, unsafe_allow_html=True)

    st.write("Pic-to-Headerは、マスク画像と入力画像を使用してヘッダー画像を生成するPythonアプリケーションです。")
    st.write("マスク画像と入力画像をアップロードして、ヘッダー画像を生成します。")

    # 2段組レイアウトの作成(左側を狭く、右側を広く)
    control_column, display_column = st.columns([1, 2])

    with control_column:
        # マスク管理インスタンスの作成
        mask_manager = MaskManager()

        # マスク画像の取得方法を選択
        mask_source = st.radio(
            "マスク画像の取得方法を選択",
            ["プリセットから選択", "URLから取得", "ファイルをアップロード"]
        )

        mask_image = None
        if mask_source == "プリセットから選択":
            preset_name = st.selectbox(
                "プリセットを選択",
                mask_manager.get_preset_names()
            )
            mask_image = mask_manager.get_preset_mask(preset_name)
        
        elif mask_source == "URLから取得":
            mask_url = st.text_input("マスク画像のURLを入力")
            if mask_url:
                mask_image = mask_manager.load_mask_from_url(mask_url)
        
        else:  # ファイルをアップロード
            mask_file = st.file_uploader("マスク画像をアップロード", type=["png", "jpg", "jpeg"])
            if mask_file is not None:
                mask_image = Image.open(mask_file)

        # 透明度の調整
        alpha = st.slider("マスクの透明度", 0.0, 1.0, 1.0)

        # ファイルアップロード(複数ファイル対応)
        uploaded_files = st.file_uploader(
            "画像をアップロードしてください",
            type=["png", "jpg", "jpeg", "webp"],
            accept_multiple_files=True
        )
        if mask_image:
            # マスク画像のプレビュー表示
            st.write("選択中のマスク画像:")
            st.image(mask_image, caption="マスク画像", use_column_width=True)
            
    with display_column:

        if uploaded_files:
            st.write("処理結果:")
            # 各画像の処理と表示
            for idx, uploaded_file in enumerate(uploaded_files):
                # 水平に2列で表示するための設定
                img_col1, img_col2 = st.columns(2)
                
                # 元画像の表示
                with img_col1:
                    st.write(f"元画像 {idx + 1}:")
                    st.image(uploaded_file, use_column_width=True)

                # 処理後の画像の表示
                with img_col2:
                    st.write(f"処理後 {idx + 1}:")
                    input_image = prepare_image(uploaded_file)
                    if input_image is not None:
                        result = process_image(input_image, np.array(mask_image), alpha)
                        result_pil = convert_to_pil(result)
                        st.image(result_pil, use_column_width=True)
                        
                        # ダウンロードボタンの作成
                        create_download_button(
                            result_pil,
                            f"header_{uploaded_file.name}"
                        )
                
                # 区切り線を追加(最後の画像以外)
                if idx < len(uploaded_files) - 1:
                    st.markdown("---")
                        
if __name__ == "__main__":
    main()