GraphicsMagick обрезать: показывает, что будет обрезано

Я работаю над приложением для фотографий, и мне нужен совет, как решить следующие проблемы с помощью Graphics/ImageMagick.

  1. Дано фото с разрешением: 2048x1536
  2. С учетом указанного разрешения: 1864x1228
  3. Измените размер изображения и заполните указанное разрешение изображением (теперь оно 1864x1398)
  4. Выделите область исходного изображения будет обрезана (до 1864x1228)

У меня есть рабочее решение, которое изменяет размеры и обрезает изображение должным образом:

IMOperation resizeOp = new IMOperation();
resizeOp.addImage();
resizeOp.resize(MAX_WIDTH, MAX_HEIGHT, "^");
resizeOp.gravity("center"); //centered image with crop the top/bottom parts
resizeOp.crop(MAX_WIDTH, MAX_HEIGHT, 0, 0);
resizeOp.addImage();

ConvertCmd cmd = new ConvertCmd(true);
cmd.run(resizeOp, fileName, outputFileName); //cropped, center filled image (1864x1228)

Вопрос в том, как мне сделать следующее: показать полное изображение вместо обрезанной версии и выделить область изображения, которая будет обрезана. Я бы предпочел с красной рамкой вокруг обрезанного изображения и показывать обрезанные части с альфа-слоем.

У меня есть идея, которая мне не очень нравится: сгенерируйте изображение из оригинала с альфа-слоем и поместите на него обрезанное изображение с красной рамкой. Это не кажется оптимальным решением:) Моя другая идея - сделать это с помощью изображений javafx, но это также кажется неоптимальным.

Заметки:

  • Я использую im4java с GM. Я также принимаю решение командной строки (и я разберусь и выложу его в im4java;)
  • Мы можем ограничить разговор только о горизонтальных изображениях, я могу разобраться с вертикальными операциями

Любые комментарии будут высоко оценены.

1 ответ

Решение

Oneliner imagemagick convert (удалить разрывы строк):

    convert ( in.jpg -resize 1864x1228^ -fill white -colorize 50% )
            ( in.jpg -resize 1864x1228^ -gravity center -crop 1864x1228+0+0 )
            -gravity center -composite out.jpg

В Bash вы должны избежать () персонажи с \ !

Я решил это в im4java с подоперациями:

    IMOperation op = new IMOperation();

    op.openOperation();
    op.addImage(); //input image
    op.resize(MAX_WIDTH, MAX_HEIGHT, "^");
    op.fill("white");
    op.colorize(50);
    op.closeOperation();

    op.openOperation();
    op.addImage(); //input image
    op.resize(MAX_WIDTH, MAX_HEIGHT, "^");
    op.gravity(GRAVITY_OPT_CENTER); //centered image with crop the top/bottom parts
    op.crop(MAX_WIDTH, MAX_HEIGHT, 0, 0);
    op.closeOperation();

    op.gravity(GRAVITY_OPT_CENTER);
    op.composite();
    op.addImage(); // output image

Заметки:

  • Он по-прежнему не содержит красной рамки (я не могу добавить рамку только ко второму изображению).
  • Я решил использовать эффект "Fade to White" вместо игры с альфа-каналом.

Пример:

  • вход:
  • вывод:
Другие вопросы по тегам