up
This commit is contained in:
@@ -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")
|
||||
Reference in New Issue
Block a user