从 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))
我有一个 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))