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

时间:2016-04-27 14:41:18

标签: python imagemagick subprocess jpeg

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

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

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

请注意,mogrifyconvert相同,但会保存原始文件。

当我使用Python子进程时,图像会沿着边缘被破坏。

Image with corruption

幸运的是,错误日志中记录了错误:

[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似乎以某种方式损坏了文件。感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:2)

我找到了修复!在运行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")

现在已删除元数据而不会损坏。