有没有办法用PIL来加速Save方法?

问题描述 投票:0回答:3

我有一个 API,可以将图像保存到 S3 存储桶并返回 S3 URL,但 PIL 图像的保存部分很慢。这是一段代码:

from PIL import Image
import io
import boto3

BUCKET = ''
s3 = boto3.resource('s3')

def convert_fn(args):
  pil_image = Image.open(args['path']).convert('RGBA')
  .
  .
  .
  in_mem_file = io.BytesIO()
  pil_image.save(in_mem_file, format='PNG') #<--- This takes too long
  in_mem_file.seek(0)
  s3.meta.client.upload_fileobj(
      in_mem_file,
      BUCKET,
      'outputs/{}.png'.format(args['save_name']),
      ExtraArgs={
          'ACL': 'public-read',
          'ContentType':'image/png'
      }
                               )

  return json.dumps({"Image saved in": "https://{}.s3.amazonaws.com/outputs/{}.png".format(BUCKET, args['save_name'])})

如何加快上传速度?,返回字节会更容易吗?

Image.save
方法是我的脚本中最耗时的部分。我想提高应用程序的性能,并且我认为以字节流形式返回可能是返回图像的最快方式。

python image computer-vision python-imaging-library amazon-sagemaker
3个回答
2
投票

将图像数据压缩为 PNG 需要时间 - CPU 时间。可能有比 PIL 更好的性能库,但你必须将它与 Python 接口,而且仍然需要一些时间。

“返回字节”没有任何意义 - 您要么想要将图像文件保存在 S3 上,要么不想。只要“字节”被正确编码到图像文件中,它们就只能代表图像,除非您有代码从原始字节组合回图像。

为了加快速度,您可以创建一个 AWS lambda 项目,该项目将采用未编码的数组,生成 png 文件并以异步模式将其保存到 S3,或者更简单,您可以尝试以未压缩的格式保存图像,这将节省您压缩 PNG 的 CPU 时间:尝试将其保存为

.tga
.bmp
文件而不是
.png
,但预计最终文件将比同等 .PNG 大 10 到 30 倍。

另外,从代码中并不清楚这是否是在 web-api 视图中,并且您希望加快 API 返回速度,如果 API 返回后在后台生成图片并上传就可以了.

在这种情况下,有方法可以提高应用程序的响应能力,但我们需要“网络代码”:即您正在使用哪个框架、视图函数本身以及对此处介绍的函数的调用。


2
投票

PIL.Image.save
中,保存 PNG 时,有一个名为
compression_level
的参数,带有
compression_level=0
,我们可以以不压缩为代价实现更快的节省。 文档


0
投票

使用 PIL 函数保存参数时压缩级别 = 0

img = Image.open("mi_imagen.jpg")

img.save(“mi_nueva_imagen.png”,压缩级别=0)

© www.soinside.com 2019 - 2024. All rights reserved.