从 Flask-Uploads 数据复制 PIL 图像后丢失字节

Missing bytes after making copy of PIL image from Flask-Uploads data

我有一个 Flask 应用程序,我试图对从 Flask-WTF -> Flask-Uploads 收到的文件执行一些 PIL/Pillow 操作,但是当我保存文件时我丢失了字节和图像无效。

似乎即使在没有额外 PIL 操作的情况下制作图像副本也会导致原始上传损坏:

@sights_blueprint.route('/add', methods=['GET', 'POST'])
def add_image():
form = AddImageForm()
if request.method == 'POST':
    if form.validate_on_submit():

        # uploaded file
        f = form.sights_image.data
        filename = secure_filename(f.filename)

        # PIL open + copy
        img = Image.open(f).copy()

        # save original file
        f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

结果:

original_file: 4622336 bytes
saved_file:     886784 bytes

如果我删除 img = Image.open(f).copy() 上传的文件会正确保存。

如果我用PIL打开图片:

    # PIL open (no copy)
    img = Image.open(f)

该文件也将正确保存。

但是如果我执行任何操作,复制或其他方式,生成的保存文件缺少字节和无效图像。

我怎样才能实现这个理想的工作流程?

对使用PIL Image.open(f)打开的文件进行操作时,文件指针会提前但不会在写入文件之前重置。我认为在 copy() 的情况下,文件指针将到达文件末尾并且不会写入任何字节,但根据我之前的部分写入,它似乎并非如此。无论如何,解决方案是在保存之前将文件指针倒回到文件的开头。 在我的用例中,也没有必要打开副本。

img = Image.open(f)
# do some stuff to img
f.seek(0)
f.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))