相对于错误(右上)点的图像旋转

时间:2018-11-14 00:01:08

标签: imagemagick

我正在尝试将旋转的图像放置在空白画布上。

这是我正在使用的命令:

+136+148

我希望图像以-10.75的中心旋转显示。但是,它似乎是围绕其右上角旋转的。

我在Photoshop中确认了这一点

这是生成的图像(使用略有不同的大小,但参数与此处给出的示例命令相同):

img one

这4行是用于标记坐标的参考线,这些坐标定义了图像所在的位置。如您所见,图像旋转了-rotate度。旋转中心在右上角。

在这里,我选择Photoshop中正确坐标处的框:

img two

在这里,我将旋转点设置为右上角之后对其进行旋转:

img three

如您所见,所选内容现在与我的convert命令计算出的图像匹配。

我已经尝试处理了好几个小时。我尝试切换到+ distort和-distort等等,但是我只是得到了裁剪的图像或另一个错误放置的边界框。

我不知道如何解决这个问题。我究竟做错了什么?我该如何告诉#include <stdio.h> #include <string.h> int main(int argc,char const *argv[]){ char input[1024]; while(fgets(input,1024,stdin)!=NULL){ printf("%s", input); } if(EOF){ printf("EOF"); } return 0; } 将图片围绕其中心而不是右上角旋转(为什么还要右上角?)。

谢谢您的帮助!

4 个答案:

答案 0 :(得分:1)

enter image description here

尝试使用与目标区域的外边缘对齐的偏移几何形状。这将更多地沿着我在此处添加的红线,而不是示例图像中的青色线。

编辑添加:有关一种找到适当的偏移信息以填充孔并将图像放置在孔下方的方法,请参见此线程中的其他答案。

答案 1 :(得分:1)

默认的偏移重力为西北角或左上角。添加背景后,您使用的几何偏移量将移动填充后的旋转图像的左上角,而不是移动Input旋转位置的左上角。因此,我认为这可能就是为什么您未获得预期结果的原因。 ImageMagick -rotate确实绕其中心旋转,但会填充背景以制作一个完整的矩形图像,该矩形图像是围绕旋转图像的边界矩形。

在ImageMagick中,一种更好的方法是使用-gravity center并将旋转的输入图像的中心与叠加图像中透明区域的中心对齐。

或者,测量覆盖层中透明区域的4个角和输入图像的4个角,然后进行透视或仿射扭曲以使两者对齐。

这是使用bash Unix语法进行操作的方法。

over1="122,186"
over2="466,118"
over3="510,345"
over4="166,411"
WxH=`convert -ping "Image.jpg" -format "%wx%h" info:`
ww=`echo "$WxH" | cut -dx -f1`
hh=`echo "$WxH" | cut -dx -f2`
ww=$((ww-1))
hh=$((hh-1))
in1="0,0"
in2="$ww,0"
in3="$ww,$hh"
in4="0,$hh"
convert overlay.png \
\( Image.jpg -virtual-pixel none +distort Perspective \
"$in1 $over1  $in2 $over2  $in3 $over3  $in4 $over4" \) \
-layers merge +repage \
out.png


enter image description here

请参见https://imagemagick.org/Usage/distorts/#perspective

答案 2 :(得分:1)

您可以在覆盖图像中找到切口的位置,然后使用该信息通过类似这样的命令来正确放置下方图像...

convert overlay.png -background none \
   \( +clone -alpha extract -trim \
      -set option:offset +%[fx:page.x]+%[fx:page.y] +delete \) \
   \( image.jpg -rotate -10.7 -set page %[offset] \) \
   -set page %[fx:u.w]x%[fx:u.h] +swap -layers merge result.png


这利用了以下事实:旋转的输入图像的边界框尺寸与重叠图像中透明区域的切口的边界框尺寸相同。

读取覆盖层,并在括号内对其进行克隆,提取alpha通道,并对结果进行修整以找到切口的偏移量。它将偏移量保存到名为“ offset”的变量中。

然后在另一组括号内读取下面的图像,将其旋转已知的-10.7度,然后使用该变量“ offset”在旋转的“ image.jpg”上设置分页偏移。

然后在括号之外,它使用覆盖层的宽度和高度来设置下方图片的分页尺寸。

通过交换图像顺序以将叠加层放在顶部,然后合并两层以创建输出来完成。

答案 3 :(得分:0)

这里是GeeMack出色的ImageMagick解决方案的替代方案。这将计算原始input.jpg的中心以及Overlay.png中透明区域的中心。然后,在最终与-layers合并进行合成之前,它使用+ distort SRT转换和旋转图像。

convert Overlay.png \
\( +clone -alpha extract -trim -set option:center "%[fx:page.x+w/2],%[fx:page.y+h/2]" +delete \) \
\( Image.jpg -virtual-pixel none +distort SRT "%[fx:w/2],%[fx:h/2] 1 -10.7 %[center]" \) \
+swap -layers merge +repage result2.png


enter image description here

第二行是GeeMack的行,但是它计算透明区域边界框的中心并将其保存在“ center”参数中,然后删除修剪后的图像。

第三行计算Input.jpg图像的中心(旋转之前)。然后,它使用+ distort SRT从输入中心进行转换(比例为1)并旋转-10.7,然后转换为透明区域边界框的中心。

请参见https://imagemagick.org/Usage/distorts/#srt