【问题标题】:How to load an image in python without using disk storage?如何在不使用磁盘存储的情况下在 python 中加载图像?
【发布时间】:2017-05-26 04:15:48
【问题描述】:

我正在编写一个烧瓶应用程序,它接收两个图像 URL 作为参数。传统上,我会在服务器本地磁盘上下载这些图像并执行我的图像处理操作。我正在使用以下代码下载它们。

urllib.request.urlretrieve(image1url, image_id + '.jpg')

在此之后,我使用以下方法读取图像:

original_image = Image.open(image_id + '.jpg')

并执行我的图像处理操作,例如裁剪和应用一些滤镜。

original_crop = original_image.crop((x, y, x + width / 3, y + height / 3))

另外,我在这张图片上使用了 ImageFilter 操作。现在,此代码将部署在服务器上。如果我继续这种方式,我将继续下载图像并将其保存在服务器的磁盘上。当然,我知道在完成图像处理操作后删除图像是一种选择。但如果我每秒接到几百个电话,我可能在某个时间点会占用大量空间。应用程序是多线程使用调用

app.run(threaded=true)

这就像一个魅力。

我想知道是否有一种方法可以在不使用服务器磁盘存储的情况下加载图像。从而减少了我的服务对硬盘空间的需求。

【问题讨论】:

  • 您是否反对仅根据文件路径在文件系统上查找图像,然后在完成后将其删除?

标签: python image image-processing flask


【解决方案1】:

如果您不想将图像存储在临时文件中,您可以将 URL 内容包装在 stream 中并将其传递给 Image.open

import io
import urllib.request

from PIL import Image

# your avatar URL as example
url = ('https://www.gravatar.com/avatar/3341748e9b07c9854d50799e0e247fa3'
       '?s=328&d=identicon&response=PG&f=1')
content = urllib.request.urlopen(url).read()
original_image = Image.open(io.BytesIO(content))

【讨论】:

  • 这看起来很漂亮!一个愚蠢的问题,但是,我可以像往常一样对“original_image”进行操作吗?
  • ofc 你可以,因为我们有 Image.Image 对象,我们可以照常使用它
  • @user2326079:但你绝对应该自己尝试一下,如果出现问题,请告诉我
  • 让我们称之为包装。像梦一样工作。谢谢,阿扎特
【解决方案2】:

您可以将它们移动到已知的远程位置,并根据需要取回它们。使用 Amazon S3 或 BrickFTP 等托管 FTP 服务都很容易。 S3 特别便宜,因为您只需按使用量付费——无需月费。如果您想让其他应用程序和用户尽可能简单地访问图像,那么 Brick 是一项很棒的服务,但有最低月费。

【讨论】:

  • 同意。但我想知道 python 本身是否有一种方法可以在运行时加载图像而不存储它。例如获取图像的字节数组?
  • 您可以使用 pickle 模块将任何 Python 对象存储在磁盘上。这样您就可以存储转换结果并重新加载它而不是图像。
猜你喜欢
  • 2018-05-08
  • 2022-06-29
  • 2023-02-08
  • 2018-12-22
  • 2011-10-04
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 2016-09-02
相关资源
最近更新 更多