ImageMagick 在 Python 子进程中删除元数据时损坏 JPEG 数据

ImageMagick Corrupt JPEG Data While Removing Metadata in Python Subprocess

我正在尝试使用 Python 子进程和 ImageMagick 从上传的测试 jpeg 文件中删除元数据。

使用 ImageMagick CLI 时,元数据删除过程完美无缺

$ mogrify -strip -auto-orient ~/Project/test.jpg

请注意 mogrifyconvert 相同,只是它保存在原始文件上。

当我使用 Python 子进程时,图像的边缘损坏了。

还好在错误日志中记录了一个错误:

[cgi:error] mogrify.exe: Premature end of JPEG file `../www/user-images/test.jpg' 
[cgi:error] mogrify.exe: Corrupt JPEG data: premature end of data segment `../www/user-images/test.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.\r
[cgi:error] mogrify.exe: Premature end of JPEG file `../www/user-images/test.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.\r
[cgi:error] mogrify.exe: Corrupt JPEG data: premature end of data segment `../www/user-images/test.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.\r
[cgi:error] mogrify.exe: Corrupt JPEG data: found marker 0xd9 instead of RST5 `test.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.\r

没有ImageMagick,图片完美上传。

Python脚本:

import cgi, os, sys, shutil, subprocess, logging
from subprocess import CalledProcessError

form = cgi.FieldStorage()
fileitem = form['test_file']

image_path = "test.jpg"

with open(image_path, 'wb') as current_file:
    # Copy file contents to new file
    shutil.copyfileobj(fileitem.file, current_file)

    # Remove metadata
    try:
        subprocess.check_output(['C:\Program Files\ImageMagick-6.9.3-Q16\mogrify.exe', '-strip', '-auto-orient', image_path])
    except CalledProcessError:
        logging.error("Error encountered while processing image")

我用不同的参数(或没有参数!)对此进行了测试,mogrify 似乎以某种方式损坏了文件。感谢您提供的任何帮助!

我找到了解决方法!我需要先关闭文件 运行 ImageMagick。

with open(image_path, 'wb') as current_file:
    # Copy file contents to new file
    shutil.copyfileobj(fileitem.file, current_file)

# CLOSE THE FILE BEFORE USING SUBPROCESS
try:
    subprocess.check_output(['C:\Program Files\ImageMagick-6.9.3-Q16\mogrify.exe', '-strip', '-auto-orient', image_path])
except CalledProcessError:
    logging.error("Error encountered while processing image")

现在元数据已被无损删除。