PIL问题,OSError:无法打开资源

时间:2017-12-07 11:46:33

标签: image python-3.x fonts python-imaging-library

我试图编写一个将文本放到图像上的程序,我试图让我的头围绕PIL并遇到错误:OSError:无法打开资源。这是我的第一个python程序,如果错误很明显,请道歉。

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont


im = Image.open("example.jpg")
font_type = ImageFont.truetype("Arial.ttf", 18)
draw = ImageDraw.Draw(im)
draw.text(xy=(50, 50), text= "Text One", fill =(255,69,0), font = font_type)
im.show()

我收到错误:

Traceback (most recent call last):
File "C:\Users\laurence.maskell\Desktop\attempt.py", line 7, in <module>
font_type = ImageFont.truetype("Arial.ttf", 18)
File "C:\Python34\lib\site-packages\PIL\ImageFont.py", line 259, in truetype
return FreeTypeFont(font, size, index, encoding, layout_engine)
File "C:\Python34\lib\site-packages\PIL\ImageFont.py", line 143, in __init__
self.font = core.getfont(font, size, index, encoding, 
layout_engine=layout_engine)
OSError: cannot open resource

8 个答案:

答案 0 :(得分:4)

我在带有PIL 5.3.0的Windows 10 Pro上也遇到了这个问题。

在我的机器上,该错误是由非ASCII字体文件名引起的。如果将字体名称更改为仅包含ASCII字符,则可以打开字体而没有任何错误。

编辑:确实是a bug with ImageFont.truetype() method,但尚未解决。

答案 1 :(得分:1)

from PIL import Image,ImageDraw,ImageFontim = Image.open("mak.png")
font_type = ImageFont.truetype("arial.ttf", 18)
draw = ImageDraw.Draw(im)
draw.text(xy=(120, 120), text= "download the font that you wanna use", fill =(255,69,0), font = font_type)
im.show()

其“ arial.ttf”不是“ Arial.ttf”

这是link to download arial.ttf字体。

答案 2 :(得分:0)

PIL无法找到指定的字体。检查它是否存在,并以完全相同的大小写命名。 您也可以尝试将其直接复制到项目文件夹中。

答案 3 :(得分:0)

它对我不起作用,因为未安装该字体。由于这里给出的答案,它现在可以工作了。安装可以完成here

答案 4 :(得分:0)

我通过使用default font 解决了问题。

ImageFont.load_default()

如果您只需要输入一些文字(字体样式对您来说并不重要),那么这可能是一个简单的解决方案。

font = ImageFont.load_default()

draw = ImageDraw.Draw(pil_img)
draw.text(( 20, 32), "text_string", (255,0,0), font=font)

答案 5 :(得分:0)

对于Linux,我使用了:

$ locate .ttf

/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-BI.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-C.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-L.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-LI.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-M.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-MI.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-RI.ttf
/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-B.ttf
/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-BI.ttf
/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-R.ttf
/usr/share/fonts/truetype/ubuntu-font-family/UbuntuMono-RI.ttf

实际上返回的比这还多!

然后,我将此处发布的python代码放在​​Stack Overflow中:

插入locate返回的字体名称“ Ubuntu-R.ttf”:

color_palette = [BLUE, GREEN, RED]
image_w=200
image_h=200
region = Rect(0, 0, image_w, image_h)
imgx, imgy = region.max.x+1, region.max.y+1
image = Image.new("RGB", (imgx, imgy), WHITE)
draw = ImageDraw.Draw(image)
vert_gradient(draw, region, gradient_color, color_palette)
#image.text((40, 80),"No Artwork",(255,255,255))
#font = ImageFont.truetype(r'C:\Users\System-Pc\Desktop\arial.ttf', 40)
#font = ImageFont.load_default()
font = ImageFont.truetype("Ubuntu-R.ttf", int(float(image_w) / 6))
draw.text((int(image_w/12), int(image_h / 2.5)), "No Artwork", \
           fill=(0,0,0), font=font)
image.show()

瞧!现在,当我正在播放的音乐文件中没有图像要显示时,我将显示一个图像:

No Artwork.png

答案 6 :(得分:0)

我也面临着同样的问题。但后来发现这与斜杠有关。因此,如果其他人错过了这个小东西,那是给你的。

我在字体文件夹中有该字体。当我尝试使用 font / .ttf 导入字体时,代码无法找到它。用\替换/,它可以找到字体。

答案 7 :(得分:0)

我认为您应该将字体移动到 fonts 或任何文件夹。我在heroku上遇到了同样的问题。在我将字体移动到字体目录后,它就可以工作了