【问题标题】:How to create bitmap with Pillow from image without saving image?如何使用 Pillow 从图像创建位图而不保存图像?
【发布时间】:2017-12-20 15:22:51
【问题描述】:

目前我使用

im.save(save_img)
out_book.get_sheet(0).insert_bitmap(save_img, 0, 0)

将位图插入到 Excel 工作表中。

我尝试使用将我的图像转换为位图

im = Image.tobitmap(image_name)

但我得到AttributeError: module 'PIL.Image' has no attribute 'tobitmap'

我找到了this,但尝试并没有解决我的问题。这是一个全新的 windows 安装和一个全新的 virtualenv,其中从来没有 PIL 只有枕头 4.3.0。我还在我的枕头源文件中找到了tobitmap,它位于在线文档中。奇怪的是我可以使用

im = Image.open(image_name).convert("RGB")
im.thumbnail((533, 70))
im.save(save_img)
out_book.get_sheet(0).insert_bitmap(save_img, 0, 0)

但不是tobitmap,有什么想法吗?

编辑:当然我可以在插入后删除临时保存的文件,但这并不是真正的pythonic/好方法。

【问题讨论】:

  • insert_bitmap() 接受什么类型的参数?也许它必须是文件的名称/路径。
  • insert_bitmap 采用文件路径,但这与我得到的错误有什么关系?
  • pillow 是 Python 图像库 PIL 的一个分支。它主要是向后兼容的,但它确实具有支持 Python 3 和错误修复等附加功能。顺便说一句,Image.tobitmap() 方法仅适用于位图图像(每像素 1 位,又名mode='1')。
  • 它是相关的,因为它需要你创建一个文件来传递给它。
  • 就是这样。谢谢你。如果您将其作为答案,我可以接受。愚蠢的错误

标签: python image bitmap pillow


【解决方案1】:

如果你使用from PIL import Image——就像你在使用枕头库时应该使用的那样——那么之后Image将是模块的名称,它没有名为tobitmap的属性或函数。您可能会感到困惑,因为该模块中还有一个类,它也被命名为Image,并且该类的实例do 有一个您可以尝试使用的tobitmap() 方法。

底线:你需要调用Image.open() 或者创建一个Image.Image instance 然后你可以调用它的tobitmap() 方法。

也就是说,我认为这无助于避免在调用 out_book.get_sheet(0).insert_bitmap() 之前将图像保存到文件,因为根据您在评论中所说的,听起来 insert_bitmap() 方法将接受文件/path 参数(换句话说,文件的名称,而不是仅存储在内存中的东西。

【讨论】:

  • 最后一部分特别重要。不知道我之前怎么没有意识到这一点。所以是的,我想我必须保持现在的状态。
  • 存在名为Image 的模块和类的事实确实令人困惑。为了帮助您完成任务,请考虑使用tempfile.NamedTemporaryFile() 创建一个临时文件,并将其名称传递给insert_bitmap()。一定要指定delete=False,这样它就不会在关闭时被自动删除(只需在调用插入后的某个时间自己做)。在我的this answer 中有一个使用它的示例(解决不同的问题)。
猜你喜欢
  • 2020-11-22
  • 2021-06-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2011-06-20
相关资源
最近更新 更多