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

Imagemagick 相对于错误(右上)点的图像旋转,imagemagick,Imagemagick,我正在尝试将旋转的图像放置到空白画布上 这是我正在使用的命令: convert "(" -size 1000x1000 xc:transparent ")" "(" "img.jpg" -virtual-pixel white -rotate -10.75 ")" -geometry +136+148 -composite "overlay.png" -geometry +0+0 -composite out.png 我希望图像出现在围绕其中心旋转的+136+148处。但是,它似乎是围绕其右上

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

这是我正在使用的命令:

convert "(" -size 1000x1000 xc:transparent ")" "(" "img.jpg" -virtual-pixel white -rotate -10.75 ")" -geometry +136+148 -composite "overlay.png" -geometry +0+0 -composite out.png
我希望图像出现在围绕其中心旋转的
+136+148
处。但是,它似乎是围绕其右上角旋转的

我在Photoshop中确认了这一点:

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

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

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

在这里,我将旋转点设置为右上角后旋转它:

如您所见,选择现在与图像匹配,因为它是由我的convert命令计算的

我已经试着处理这个问题好几个小时了。我试着切换到+扭曲和-扭曲等等,但我只是得到了一个裁剪过的图像或另一个错误定位的边界框

我不知道如何解决这个问题。我做错了什么?我如何告诉
-rotate
围绕图像中心旋转图像,而不是围绕右上角旋转图像(为什么是右上角?)

谢谢你的帮助

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


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

偏移的默认重力是西北角或左上角。添加填充旋转图像的背景后,使用的几何体偏移将移动填充旋转图像的左上角,而不是旋转输入的图像的左上角。所以我认为这可能是你没有得到预期结果的原因。ImageMagick-rotate确实围绕其中心旋转,但它会填充背景以生成一个完整的矩形图像,即旋转图像周围的边界矩形

在ImageMagick中,更好的方法是使用-重心并将旋转输入图像的中心与覆盖图像中透明区域的中心对齐

或者,测量覆盖中透明区域的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


请参见

您可以在覆盖图像中找到剪切的位置,然后使用该信息使用以下命令正确放置图像下方

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”上的分页偏移

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


它通过交换图像顺序以将覆盖层置于顶部,然后合并两层以创建输出来完成。

这里是GeeMack出色的ImageMagick解决方案的替代方案。这将计算原始input.jpg的中心和Overlay.png中透明区域的中心。然后使用+扭曲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

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

第三行计算Input.jpg图像的中心(旋转前)。然后使用+扭曲SRT从输入中心平移(比例=1),旋转-10.7并平移到透明区域边界框的中心


请参见

在您的第一个示例中,重叠图像似乎是围绕其中心旋转的,并且是在您使用“几何体”设置指定的位置合成的。您可能需要调整几何设置,以便覆盖图的左上角与灰白色选中区域的最左侧和最顶部点对齐(如果这是您的合成目标)。谢谢。不幸的是,我缺乏必要的数学技能来推导旋转矩形的坐标——我所能得到的只是矩形的原始坐标及其角度。我也真的不知道如何计算旋转剪切区域的中心。