在網路上下載了很照片, 想放到電視當背景, 網路上很多都是直立式圖片, 但電視是橫的, 所以想自動把直的套用溶解特效:

增加特效參數的 Python 腳本
這是一支擴充後的程式碼。我們新增了 --effect 參數,讓你可以自由切換不同的邊緣處理特效,包含預設的溶解,以及模糊與透明度漸層,達到讓圖片邊緣不那麼明顯的目的。
功能特色
- 支援三種邊緣特效:溶解、模糊、透明度漸層。
- 可透過參數自由切換特效類型與特效寬度。
- 自動偵測左右黑邊並套用特效。
程式碼
請將 dissolve.py 更新為以下內容:
Python
import argparse
import glob
import os
import cv2
import numpy as np
def add_edge_effect(image_path, width, effect_type):
img = cv2.imread(image_path)
if img is None:
return
h, w, c = img.shape
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
col_max = np.max(gray, axis=0)
black_threshold = 10
left_border = 0
for x in range(w // 2):
if col_max[x] > black_threshold:
left_border = x
break
right_border = w - 1
for x in range(w - 1, w // 2, -1):
if col_max[x] > black_threshold:
right_border = x
break
right_border += 1
if right_border > w:
right_border = w
output = img.copy()
if effect_type == 'dissolve':
np.random.seed(42)
if left_border > 0:
start_x = left_border
end_x = min(w, left_border + width)
for y in range(h):
for x in range(start_x, end_x):
prob = (x - start_x) / width
if np.random.rand() > prob:
output[y, x] = [0, 0, 0]
if right_border < w:
start_x = max(0, right_border - width)
end_x = right_border
for y in range(h):
for x in range(start_x, end_x):
prob = (end_x - x) / width
if np.random.rand() > prob:
output[y, x] = [0, 0, 0]
elif effect_type == 'blur':
# 對整張圖進行模糊,然後利用遮罩將邊緣與原圖融合
blurred = cv2.GaussianBlur(img, (width * 2 + 1, width * 2 + 1), 0)
if left_border > 0:
start_x = left_border
end_x = min(w, left_border + width)
for x in range(start_x, end_x):
alpha = (x - start_x) / width
output[:, x] = (
img[:, x] * alpha + blurred[:, x] * (1 - alpha)
).astype(np.uint8)
if right_border < w:
start_x = max(0, right_border - width)
end_x = right_border
for x in range(start_x, end_x):
alpha = (end_x - x) / width
output[:, x] = (
img[:, x] * alpha + blurred[:, x] * (1 - alpha)
).astype(np.uint8)
elif effect_type == 'fade':
if left_border > 0:
start_x = left_border
end_x = min(w, left_border + width)
for x in range(start_x, end_x):
alpha = (x - start_x) / width
output[:, x] = (img[:, x] * alpha).astype(np.uint8)
if right_border < w:
start_x = max(0, right_border - width)
end_x = right_border
for x in range(start_x, end_x):
alpha = (end_x - x) / width
output[:, x] = (img[:, x] * alpha).astype(np.uint8)
dir_name, file_name = os.path.split(image_path)
output_dir = os.path.join(dir_name, 'output')
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, file_name)
cv2.imwrite(output_path, output)
print(f'已處理完成:{output_path}')
def main():
parser = argparse.ArgumentParser(
description='自動偵測左右黑邊並產生邊緣漸層特效。'
)
parser.add_argument(
'--width', type=int, default=10, help='特效寬度,預設為 10 像素。'
)
parser.add_argument(
'--cwd', type=str, default='.', help='工作目錄路徑,預設為目前資料夾。'
)
parser.add_argument(
'--effect',
type=str,
default='dissolve',
choices=['dissolve', 'blur', 'fade'],
help='特效類型:dissolve 溶解、blur 模糊、fade 透明度漸層。',
)
args = parser.parse_args()
target_dir = args.cwd
if not os.path.isdir(target_dir):
print(f'錯誤:找不到目錄 {target_dir}')
return
search_path = os.path.join(target_dir, '*.jpg')
files = glob.glob(search_path)
if not files:
print('在指定目錄中找不到任何 jpg 圖片。')
return
for file_path in files:
add_edge_effect(file_path, args.width, args.effect)
if __name__ == '__main__':
main()
使用方式
你可以透過 --effect 參數指定想要的特效類型:
預設溶解特效:
Bash
python dissolve.py
使用模糊特效:
Bash
python dissolve.py --effect blur --width 15
使用漸層淡出特效:
Bash
python dissolve.py --effect fade --width 20
錯誤處理
Error message:
File c:\cleanyourtv\themes\leejueun\wallpapers\dissolve.py", line 3, in <module>
import cv2
ModuleNotFoundError: No module named 'cv2'
處理模組錯誤
這代表你的電腦沒有安裝 OpenCV 套件。請注意,在 pip 裡面安裝 OpenCV 的套件名稱不是 cv2,而是 opencv-python。
解決步驟
請在終端機中輸入以下指令來安裝正確的套件:
Bash
python -m pip install opencv-python
安裝完成之後,再次執行你的 Python 腳本即可正常運作。