环境:linux && docker容器
代码: v8
主题描述: 服务器上写中文报错
近日需求在linux 服务器上部署根据v8代码,我其中的一个需求是需要在输出的图片上写上中文标签,项目代码在本地windows上经测试全部通过,然而一旦部署到linux服务器上,便报出如下错误
百度搜索过后,表象原因是因为PIL库的getsize()等函数不支持256位之后的编码,都让我对涉及到的中文进行转码,比如这样: "中文".encode('utf-8') ,这种方法确实可以解决问题,但是运行速度极慢。然后怀疑是pillow库的版本问题,降低版本后也是不行。
经过考虑过后,我认为既然windows能够正常运行,就说明不用转码,在认真考虑pillow(PIL)库的的原理之后,将问题的本质锁定到缺少字体方面。 我们知道opencv不支持中文的,而我使用的是PIL画图就涉及字体,所以本质其实是字体没找到。
第一步:查v8源码在utils/plotting.py中Arial.ttf 和Arial.Unicode.ttf两个字体如下
既然本地windows10能运行,说明本地已经有了两种字体,电脑全局搜索找到了两种字体。
第二步:在服务器上使用
# 查看全部字体
fc-list
#(只查看中文字体)
fc-list :lang=zh
如果上述命令报错请先安装
sudo apt-get install ttf-mscorefonts-installer
sudo apt-get install fontconfig
# 如docker 容器中没有sudo 命令可去掉sudo 命令
服务器上执行该命令找到字体的存放位置
# 找到服务器或docker容器中存放fonts的路径
find / -name fonts
一般存放到/usr/local/share/fonts下面,不同服务器版本可能略有不同,根据自己输出路径存放
一般都是存放到/usr/local/share/fonts下面 ,将上述两个字体上传到该目录下面执行如下命令让字体产生字体路径索引和生效
#给字体赋权
sudo chmod 777 xxx.ttf
产生字体索引和清除缓存让字体生效
mkfontscale && mkfontdir && fc-cache -fv
再次执行fc-list :lang=zh 如果显示有上传的字体说明已经将字体安装成功
最重要的一步是修改v8涉及字体部分的源码 我的v8代码是在utils/plotting.py中如下修改字体路径
然后保存,重新编译python代码执行即可。