Преобразование ImageMagick выводит искаженное изображение

#python #flask #imagemagick #imagemagick-convert

#python #flask #imagemagick #imagemagick-преобразовать

Вопрос:

У меня есть приведенный ниже код. По какой-то причине он выводит это искаженное изображение:

введите описание изображения здесь

оригинал:

введите описание изображения здесь

(Мне не разрешено использовать какие-либо готовые библиотеки Python в этом упражнении)

 @app.route("/flip", methods=["POST"])
def flip():

    # retrieve parameters from html form
    if 'horizontal' in request.form['mode']:
        direction = 90
    elif 'vertical' in request.form['mode']:
        direction = -90

    filename = request.form['image']

    # open and process image
    target = os.path.join(APP_ROOT, 'static/images')
    destination = "/".join([target, filename])

    img = Image.open(destination)
    subprocess.call(['C:Program FilesImageMagick-7.0.10-Q16-HDRImagick.exe', 'convert',  f'{destination}', '-rotate', f'{direction}', f'{destination}'], shell=True)
    # save and return image
    destination = "/".join([target, 'flipped.jpg'])
    if os.path.isfile(destination):
        os.remove(destination)
    img.save(destination)
    return send_image('flipped.jpg')
 

РЕДАКТИРОВАТЬ: когда я устанавливаю целевое изображение в subprocess.call значение flipped.jpg — выводится исходное изображение. Почему?

Комментарии:

1. Вы почти наверняка не хотите magick.exe convert INPUT OUTPUT , потому что это вызывает специфическое, редко необходимое поведение. Вы, скорее всего, захотите magick.exe INPUT OUTPUT , чтобы это было опущено 'convert' . Хотя я сомневаюсь, что это исправит. Попробуйте автономную команду в командной строке и посмотрите, ведет ли она себя так же, если да, мы можем исключить Python в качестве причины.

2. Пожалуйста, поделитесь также точным файлом входного изображения — это JPEG или PNG?

3. Почему ты попал img = Image.open() туда и img.save() туда? Предполагается, что вы не должны использовать PIL.

4. @MarkSetchell jpg. Правильно, я забыл убрать содержимое PIL.

5. @MarkSetchell Все еще — как я могу преобразовать исходное изображение в повернутое изображение, чтобы входные данные для каждого вызова flip поворачивали последнее (повернутое) изображение? То есть, как я могу переписать PIL-код без использования PIL?

Ответ №1:

Решаемая:

     if 'horizontal' in request.form['mode']:
        direction = 'flip'
    elif 'vertical' in request.form['mode']:
        direction = 'flop'
        filename = request.form['image']

    # open and process image
    target = os.path.join(APP_ROOT, 'static/images')
    destination = "/".join([target, filename])
    subprocess.call(['C:Program FilesImageMagick-7.0.10-Q16-HDRImagick.exe', 
                     'convert',  f'{destination}', '-'f'{direction}', f'{destination}'], 
                     shell=True)
    return send_image(filename)
 

Комментарии:

1.Почему вы упорствуете magick convert INPUT OPERATIONS OUTPUT ? Вы должны использовать magick INPUT OPERATIONS OUTPUT without convert , как я предложил в комментариях.