docker部署python项目中pillow的字体文件解决

一、前言

我从下午一点开始弄,到下午四点才完全搞定

二、思路

主要是将自定义的存放字体文件的文件夹加入到搜索目录里面

三、代码

覆写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里面,可能返回原来的路径。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值