---
# System prepended metadata

title: '[Python] 一字圖示產生'
tags: [Python]

---

# 一字圖示產生
## 說明
* 設計是用來快速產生一個 64x64 的 icon，可以用作網頁的 favicon

## 第三方資料庫
* `pip install pillow`

## 程式碼
```python=
import os
from PIL import Image, ImageDraw, ImageFont
import time

# 顏色選項字典，顏色名稱對應顏色值
color_options = {
    "蜜蜂紅": "#e2808a",
    "玫瑰粉": "#f1ccd7",
    "薄荷綠 1": "#2e765e",
    "薄荷綠 2": "#638c80"
}

def create_icon(input_char, background_color, output_file):
    # 設定圖像大小
    size = (64, 64)

    # 創建透明底圖像
    image = Image.new("RGBA", size, (0, 0, 0, 0))
    draw = ImageDraw.Draw(image)

    # 使用選擇的背景顏色
    background_rgb = tuple(int(background_color[i:i+2], 16) for i in (1, 3, 5))
    
    # 畫圓角矩形背景
    corner_radius = 12  # 圓角半徑
    draw.rounded_rectangle([0, 0, size[0], size[1]], radius=corner_radius, fill=background_rgb)

    # 嘗試加載指定的字體
    try:
        font_path = r"C:\Windows\Fonts\msjhbd.ttc"  # 更換為您的字體路徑
        font = ImageFont.truetype(font_path, 48)  # 字體大小設定為 48
    except IOError:
        print("錯誤：無法找到指定字體。")
        return

    # 計算文字的邊界框（bounding box）大小並調整位置
    bbox = draw.textbbox((0, 0), input_char, font=font)  # 使用 textbbox() 獲取邊界框
    text_width = bbox[2] - bbox[0]  # 邊界框的寬度
    text_height = bbox[3] - bbox[1]  # 邊界框的高度
    
    # 計算文字位置，將文字置中
    position = ((size[0] - text_width) / 2, (size[1] - text_height) / 2)
    
    # 畫文字的黑色描邊
    outline_color = (20, 20, 20)  # 黑色描邊
    outline_width = 1  # 描邊寬度

    # 描邊處理：繪製文字多次，稍微偏移位置來達到描邊效果
    for dx in range(-outline_width, outline_width + 1):
        for dy in range(-outline_width, outline_width + 1):
            if dx != 0 or dy != 0:
                draw.text((position[0] + dx, position[1] + dy), input_char, outline_color, font=font)

    # 寫入白色文字
    draw.text(position, input_char, (255, 255, 255, 255), font=font)

    # 獲取桌面路徑
    desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")

    # 設定檔案儲存位置（使用當前時間戳作為檔名）
    timestamp = int(time.time())  # 使用時間戳作為檔名
    output_file_path = os.path.join(desktop_path, f"{timestamp}.png")

    # 保存為 PNG
    image.save(output_file_path, "PNG")
    print(f"已生成 {output_file_path} 圖像檔案。")

# 顯示顏色選項
print("請選擇背景顏色：")
for index, color in enumerate(color_options.keys(), 1):
    print(f"{index}. {color}")

# 用戶選擇背景顏色
try:
    color_choice = int(input("輸入顏色選項（1-4）："))
    if 1 <= color_choice <= 4:
        selected_color = list(color_options.values())[color_choice - 1]
    else:
        print("無效的選項。")
        exit()
except ValueError:
    print("請輸入有效的數字選項。")
    exit()

# 輸入單一字元
input_char = input("請輸入一個字元：")
if len(input_char) == 1:
    create_icon(input_char, selected_color, None)
else:
    print("請只輸入一個字元。")

```