【问题标题】:PIL: OSError: Unknown File FormatPIL:OSError:未知文件格式
【发布时间】:2021-07-03 22:21:43
【问题描述】:

尝试使用 Stack Overflow 上其他问题中的一段代码。碰到这段代码:

from PIL import ImageFont
from urllib.request import urlopen

truetype_url = 'https://github.com/googlefonts/roboto/blob/main/src/hinted/Roboto-Black.ttf'
font = ImageFont.truetype(urlopen(truetype_url), size=10)

我收到了这个错误:

OSError: unknown file format

我尝试了其他建议,例如使用 requests.get 重新安装 PIL,但我收到了同样的错误。我检查了链接,它确实将您带到了有问题的项目。还有其他建议我可以尝试吗?

我的目标: 能够从链接中获取字体,因此我不必在本地计算机上执行此操作。

谢谢!

【问题讨论】:

  • 当我访问那个 URL 时——因为它在 GitHub 上——我没有得到 TTF 文件;我得到一个网页包装器。尝试将?raw=true 添加到 URL。
  • 嗯..这似乎不起作用。我知道当您在 github 中选择“查看原始”部分时,它会弹出一个文件,我可以在其中打印或安装该项目。不太清楚在这种情况下这意味着什么。
  • 我可能问错了问题。我正在尝试创建一个图像,最终将使用 Heroku 来运行脚本。所以我的目标是看看是否有办法使用链接来获得字体,因为如果没有我相信的某种字体,我就无法真正写东西。
  • 好的,所以,我告诉你如何更改 URL 以“使用链接获取字体”。现在,您已经得到了使用更改后的 URL 的答案,并且显然是成功的。您说当您尝试时,它“似乎不起作用”;但我不知道你到底改变了什么,或者结果行为与你想要发生的不同。

标签: python python-imaging-library urllib


【解决方案1】:

你可以这样做:

from PIL import Image, ImageFont, ImageDraw
import requests
import io

# Load font from URI
truetype_url = 'https://github.com/googlefonts/roboto/blob/main/src/hinted/Roboto-Black.ttf?raw=true'
r = requests.get(truetype_url, allow_redirects=True)
font = ImageFont.truetype(io.BytesIO(r.content), size=24)

# Create a black canvas and get drawing context
canvas = Image.new('RGB', (300,180))
draw = ImageDraw.Draw(canvas)

# Write in our font
draw.text((10, 10), "Got that crazy font", font=font, fill=(255,255,255))
canvas.save('result.png')


正如 Karl 在 cmets 中指出的那样,您可以使用 urllib 进行操作,就像您最初打算这样:

from urllib.request import urlopen

truetype_url = 'https://github.com/googlefonts/roboto/blob/main/src/hinted/Roboto-Black.ttf?raw=true'

font = ImageFont.truetype(urlopen(truetype_url), size=10)

【讨论】:

  • 我必须努力为自己设置一个合适的测试,但是...requests 真的有必要吗?内置urllib.request.urlopen 中的HTTPResponse 不是足够像文件吗?
  • @KarlKnechtel 我刚刚尝试过,是的,它确实有效。我只用requests 做了它,因为 OP 说它在评论中不起作用,因为我相信它更现代和流行。我会将其添加到答案中。感谢您指出。
  • 感谢您的帮助,我很抱歉卡尔。出于某种原因,我在我的 URL 中将 Main 替换为 Master。所以当我输入 ?raw=true 时,它​​给了我同样的错误。当我在玩其他链接时,我没有注意到我改变了它。谢谢马克的回答。它就像一个魅力。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多