This commit is contained in:
jiahong
2026-03-25 23:08:58 +08:00
commit 00bd6eef13
40 changed files with 7262 additions and 0 deletions
+146
View File
@@ -0,0 +1,146 @@
#!/usr/bin/env python3
"""
Writech 商标图像处理脚本
- 去除蓝色底色,生成透明 PNG
- 系列化简洁处理,适配商标注册
"""
from PIL import Image, ImageFilter, ImageDraw
import os
SRC = "/Users/jiahong/Library/Application Support/Qoder/SharedClientCache/cache/images/7702e5b9/截屏2026-03-04 10.30.55-0be34715.jpg"
OUT_DIR = "/Users/jiahong/Documents/Job/docs/jiahong_docs/education/writech_logo"
os.makedirs(OUT_DIR, exist_ok=True)
img = Image.open(SRC).convert("RGBA")
w, h = img.size
pixels = img.load()
# ========== 1. 去蓝色底色 → 透明 PNG ==========
def remove_blue_bg(image, tolerance=100):
"""将蓝色背景区域变为透明"""
result = image.copy()
px = result.load()
for y in range(result.height):
for x in range(result.width):
r, g, b, a = px[x, y]
# 蓝色背景特征: B高, R低, G中低
# 原图蓝色约 (70, 130, 210) 左右
if b > 140 and r < 130 and b > r + 40:
# 越接近纯蓝越透明
blue_ratio = (b - r) / max(b, 1)
if blue_ratio > 0.3:
px[x, y] = (r, g, b, 0)
# 处理边缘过渡区 (半透明)
elif b > 120 and r < 150 and b > r + 20:
alpha = int(255 * (1 - (b - r) / max(b, 1)))
alpha = max(0, min(255, alpha))
px[x, y] = (r, g, b, alpha)
return result
print("生成 1: 透明底色原图...")
transparent = remove_blue_bg(img)
transparent.save(os.path.join(OUT_DIR, "writech_logo_transparent.png"), "PNG")
# ========== 2. 纯绿色线条版 (最简洁, 商标注册首选) ==========
print("生成 2: 纯绿色线条版...")
def extract_green_lines(image):
"""提取绿色线条,黑色描边,白色/透明背景"""
result = Image.new("RGBA", image.size, (0, 0, 0, 0))
px_src = image.load()
px_dst = result.load()
for y in range(image.height):
for x in range(image.width):
r, g, b, a = px_src[x, y]
# 绿色线条: G高, R中高, B低
# 原图绿色约 (160, 210, 50) 左右
if g > 140 and g > b + 50 and g > r * 0.8:
# 保留为纯绿色
intensity = g / 255.0
px_dst[x, y] = (100, 190, 60, int(255 * intensity))
return result
green_lines = extract_green_lines(img)
green_lines.save(os.path.join(OUT_DIR, "writech_logo_green_lines.png"), "PNG")
# ========== 3. 纯黑色线条版 (单色商标注册) ==========
print("生成 3: 纯黑色线条版...")
def extract_black_lines(image):
"""提取线条并转为纯黑色,适合单色商标"""
result = Image.new("RGBA", image.size, (0, 0, 0, 0))
px_src = image.load()
px_dst = result.load()
for y in range(image.height):
for x in range(image.width):
r, g, b, a = px_src[x, y]
if g > 140 and g > b + 50 and g > r * 0.8:
intensity = g / 255.0
px_dst[x, y] = (0, 0, 0, int(255 * intensity))
return result
black_lines = extract_black_lines(img)
black_lines.save(os.path.join(OUT_DIR, "writech_logo_black.png"), "PNG")
# ========== 4. 白底黑线版 (传统商标注册用) ==========
print("生成 4: 白底黑线版...")
white_bg = Image.new("RGBA", img.size, (255, 255, 255, 255))
white_bg = Image.alpha_composite(white_bg, black_lines)
white_bg.save(os.path.join(OUT_DIR, "writech_logo_white_bg_black.png"), "PNG")
# ========== 5. 白底绿线版 ==========
print("生成 5: 白底绿线版...")
white_bg2 = Image.new("RGBA", img.size, (255, 255, 255, 255))
white_bg2 = Image.alpha_composite(white_bg2, green_lines)
white_bg2.save(os.path.join(OUT_DIR, "writech_logo_white_bg_green.png"), "PNG")
# ========== 6. 正方形裁切版 (适配商标规范尺寸) ==========
print("生成 6: 正方形版本...")
size = max(w, h)
square = Image.new("RGBA", (size, size), (0, 0, 0, 0))
offset_x = (size - w) // 2
offset_y = (size - h) // 2
square.paste(transparent, (offset_x, offset_y), transparent)
# 缩放到标准尺寸 1000x1000
square_1000 = square.resize((1000, 1000), Image.LANCZOS)
square_1000.save(os.path.join(OUT_DIR, "writech_logo_square_1000.png"), "PNG")
# ========== 7. 小尺寸 icon 版 (256x256, 128x128, 64x64) ==========
print("生成 7: 多尺寸 icon...")
for sz in [512, 256, 128, 64]:
icon = square.resize((sz, sz), Image.LANCZOS)
icon.save(os.path.join(OUT_DIR, f"writech_icon_{sz}.png"), "PNG")
# ========== 8. 商标注册专用 - 极简轮廓版 ==========
print("生成 8: 极简轮廓版...")
# 先提取绿色通道做灰度,然后二值化得到清晰轮廓
gray = img.convert("L")
# 使用绿色通道强度作为阈值参考
r_ch, g_ch, b_ch, a_ch = img.split()
# 绿色减蓝色 = 线条区域
from PIL import ImageChops
diff = ImageChops.subtract(g_ch, b_ch)
# 二值化
threshold = 60
binary = diff.point(lambda p: 255 if p > threshold else 0, mode='1')
# 转回 RGBA 透明底
outline = Image.new("RGBA", img.size, (0, 0, 0, 0))
px_bin = binary.load()
px_out = outline.load()
for y in range(img.height):
for x in range(img.width):
if px_bin[x, y]:
px_out[x, y] = (0, 0, 0, 255)
outline.save(os.path.join(OUT_DIR, "writech_logo_outline.png"), "PNG")
# 白底轮廓版
white_outline = Image.new("RGBA", img.size, (255, 255, 255, 255))
white_outline = Image.alpha_composite(white_outline, outline)
white_outline.save(os.path.join(OUT_DIR, "writech_logo_outline_white.png"), "PNG")
print(f"\n✅ 全部完成!输出目录: {OUT_DIR}")
print("生成文件列表:")
for f in sorted(os.listdir(OUT_DIR)):
if f.endswith('.png'):
fpath = os.path.join(OUT_DIR, f)
fsize = os.path.getsize(fpath)
im = Image.open(fpath)
print(f" {f:45s} {im.size[0]:5d}x{im.size[1]:<5d} {fsize//1024:>5d} KB")