栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/994393.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号