GraphicsMagick обрезать: показывает, что будет обрезано
Я работаю над приложением для фотографий, и мне нужен совет, как решить следующие проблемы с помощью Graphics/ImageMagick.
- Дано фото с разрешением: 2048x1536
- С учетом указанного разрешения: 1864x1228
- Измените размер изображения и заполните указанное разрешение изображением (теперь оно 1864x1398)
- Выделите область исходного изображения будет обрезана (до 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" вместо игры с альфа-каналом.
Пример: