1

我正在开发一个照片应用程序,我需要一些建议,我应该如何使用 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)

问题是我应该如何执行以下操作:显示完整图像而不是裁剪版本,并突出显示将被裁剪的图像区域。我更喜欢裁剪图像周围的红色边框,并显示带有 alpha 层的裁剪部分。

我有一个我不太喜欢的想法:从原始图像生成一个带有 alpha 层的图像,并将裁剪后的图像放在它上面,并带有红色边框。它似乎不是最佳解决方案:) 我的另一个想法是使用 javafx imageviews 来做到这一点,但它似乎也不是最理想的。

笔记:

  • 我正在使用带有 GM 的 im4java。我也接受命令行解决方案(我会弄清楚并将其发布在 im4java 中;)
  • 我们可以限制只讨论水平图像,我可以弄清楚垂直操作

任何意见将不胜感激。

4

1 回答 1

0

oneliner imagemagick 转换(删除换行符):

    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

笔记:

  • 它仍然不包含红色边框(我不能只为第二张图片添加边框)。
  • 我决定使用“淡入白”效果,而不是使用 Alpha 通道。

例子:

于 2013-11-21T13:13:49.503 回答