一、前言
我从下午一点开始弄,到下午四点才完全搞定
二、思路
主要是将自定义的存放字体文件的文件夹加入到搜索目录里面
三、代码
覆写pillow的truetype函数
def mytruetype(font=None, size=10, index=0, encoding="", layout_engine=None):
def freetype(font):
return FreeTypeFont(font, size, index, encoding, layout_engine)
# 这个方法有坑,下面说
ttf_filename = os.path.basename(font)
print(ttf_filename, "ttf_filename")
dirs = []
if sys.platform == "win32":
windir = os.environ.get("WINDIR")
if windir:
dirs.append(os.path.join(windir, "fonts"))
elif sys.platform in ("linux", "linux2"):
lindirs = os.environ.get("XDG_DATA_DIRS", "")
if not lindirs:
lindirs = "/usr/share"
dirs += [os.path.join(lindir, "fonts") for lindir in lindirs.split(":")]
elif sys.platform == "darwin":
dirs += [
"/Library/Fonts",
"/System/Library/Fonts",
os.path.expanduser("~/Library/Fonts"),
]
# 就是这里,将自定义的文件夹加入搜索列表,我的文件夹名字就叫“字体,放在django的根目录下”
dizhi = os.path.join(BASE_DIR, "字体")
dirs.append(dizhi)
print(dirs, "所有要查找的路径")
ext = os.path.splitext(ttf_filename)[1]
print(ext, "ext")
first_font_with_a_different_extension = None
for directory in dirs:
for walkroot, walkdir, walkfilenames in os.walk(directory):
print(walkfilenames, "找到的文件名称")
for walkfilename in walkfilenames:
if ext and walkfilename == ttf_filename:
return freetype(os.path.join(walkroot, walkfilename))
elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename:
fontpath = os.path.join(walkroot, walkfilename)
if os.path.splitext(fontpath)[1] == ".ttf":
return freetype(fontpath)
if not ext and first_font_with_a_different_extension is None:
first_font_with_a_different_extension = fontpath
if first_font_with_a_different_extension:
return freetype(first_font_with_a_different_extension)
raise
使用
# 修改前的代码
font = ImageFont.truetype("simsun.ttc", 25) # 设置字体
# 修改后的代码
font = mytruetype("字魅行楷.ttf", 25) # 设置字体
注意:字体文件只需要写文件名称就行了,不要加上路径。原因是在win系统上,os.path.basename函数会返回追右侧的文件名,但是在docker里面,可能返回原来的路径。