是否有一种方法来加快保存方法与PIL?



我有一个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方法是我的脚本中最耗时的部分。我想提高我的应用程序的性能,我认为作为字节流返回可能是返回图像的最快方式。

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

"返回bytes"没有任何意义—您要么希望将图像文件保存在S3上,要么不希望。还有"字节"将只表示图像,只要它们被正确地编码到图像文件中,除非您有代码从原始字节组合回图像。

因超速,你可以创建一个AWSλ项目,将未编码阵列,生成S3的png文件并将其保存在一个异步模式,或者,更容易,你可以试一试保存图像压缩格式的,这将让你的CPU时间压缩png:尝试保存它作为.tga.bmp文件而不是.png,但是预计最终文件10到30倍相当于png。

此外,它是不清楚的代码,如果这是在一个web-api视图,你想加快API返回,这将是ok的,如果图像将生成并在后台上传API返回后。

在这种情况下,有方法来提高你的应用程序的响应性,但我们需要有"web代码":即你正在使用的框架,视图函数本身,以及调用这里呈现的函数。

PIL.Image.save中,当保存PNG时,有一个名为compression_level的参数与compression_level=0,我们可以在没有压缩的代价下创建更快的节省。文档

最新更新