Untitled
unknown
plain_text
a year ago
3.2 kB
17
Indexable
import os
import tkinter as tk
from tkinter import filedialog, messagebox
from fontTools.ttLib import TTFont
from fontTools import subset, merge
def subset_font(font_file, whitelist, subset_output):
# 加载字体
font = TTFont(font_file)
# 创建 Subsetter 对象并填充白名单字符
options = subset.Options()
subsetter = subset.Subsetter(options=options)
subsetter.populate(text=whitelist)
subsetter.subset(font)
# 保存子集字体
font.save(subset_output)
print(f"Subset font saved to {subset_output}")
def merge_fonts(font_file1, font_file2, output_file):
font1 = TTFont(font_file1)
font2 = TTFont(font_file2)
# 获取两个字体的 Unicode 映射
us1 = {}
for cmap in font1['cmap'].tables:
if cmap.isUnicode():
us1.update(cmap.cmap)
us2 = {}
for cmap in font2['cmap'].tables:
if cmap.isUnicode():
us2.update(cmap.cmap)
# 找到只存在于第一个字体的字形
unique_to_font1 = [us1[code] for code in us1 if code not in us2]
# 创建 Subsetter 对象并填充 unique_to_font1
options = subset.Options()
subsetter = subset.Subsetter(options)
subsetter.populate(glyphs=unique_to_font1)
subsetter.subset(font1)
temp_subset = "temp_subset.ttf"
subset.save_font(font1, temp_subset, options)
# 合并字体
m = merge.Merger()
merged_font = m.merge([font_file2, temp_subset])
merged_font.save(output_file)
print(f"Merged font saved to {output_file}")
# 删除临时文件
os.remove(temp_subset)
def browse_file(var):
file = filedialog.askopenfilename(filetypes=[("TTF files", "*.ttf")])
var.set(file)
def run():
whitelist = whitelist_text.get("1.0", tk.END).strip()
font_file1 = font1_var.get()
font_file2 = font2_var.get()
output_file = "merged_output.ttf"
if not whitelist or not font_file1 or not font_file2:
messagebox.showwarning("Missing Input", "Please provide all inputs.")
return
try:
subset_output = "subset.ttf"
subset_font(font_file1, whitelist, subset_output)
merge_fonts(font_file2, subset_output, output_file)
os.remove(subset_output)
messagebox.showinfo("Success", f"Merged font saved to {output_file}")
except Exception as e:
messagebox.showerror("Error", str(e))
app = tk.Tk()
app.title("Font Merger")
tk.Label(app, text="填入希望字体1中包含的字符(白名单)").pack()
whitelist_text = tk.Text(app, height=5)
whitelist_text.pack()
font1_var = tk.StringVar()
font2_var = tk.StringVar()
tk.Label(app, text="选择字体1路径").pack()
tk.Entry(app, textvariable=font1_var, width=50).pack()
tk.Button(app, text="浏览文件", command=lambda: browse_file(font1_var)).pack()
tk.Label(app, text="选择字体2路径").pack()
tk.Entry(app, textvariable=font2_var, width=50).pack()
tk.Button(app, text="浏览文件", command=lambda: browse_file(font2_var)).pack()
tk.Button(app, text="合并字体", command=run).pack()
app.mainloop()
Editor is loading...
Leave a Comment