我目前正在寻找一种裁剪图像的方法,但要以一定角度进行裁剪。 我不认为我可以先旋转图像,因为脚本提供了每个角的特定 x、y 坐标。
因此,如果您可以对此成像,则上传图像,1280x720。 连同图像一起提供了裁剪区域的 x,x 坐标。 然而,左上角和右上角的坐标不会有相同的 y 位置。
举个例子
之前
之后
有什么想法吗?
最佳答案
您仍然需要使用三角学方法来旋转图像,但您可以通过混合不透明度复制和修剪来模拟以一定角度裁剪。
首先。创建图像 mask
如果所有的点都给了你,并且图像尺寸被定义了,简单的draw需要提取的区域
WIDTH=819
HEIGHT=616
TOP_LEFT=669,117
TOP_RIGHT=784,155
BOTTOM_LEFT=544,495
BOTTOM_RIGHT=659,534
convert -size $WIDTHx$HEIGHT xc:black -fill white -stroke white \
-draw "polyline $TOP_LEFT $TOP_RIGHT $BOTTOM_RIGHT $BOTTOM_LEFT" \
mask.png
遮蔽和背景去除
masking的这个方法将关闭 alpha channel 并将背景设置为透明。当我们合成两个图像时,生成的图像将只显示我们在 mask 中定义的区域内的内容。 (注意:您可能需要将 -background
调整为白色或透明。)
convert source.jpg mask.png -alpha Off -compose CopyOpacity \
-composite -background transparent copyOpacity.png
计算旋转度数
如果你在一个方角上有两个点,你应该可以跟随 atan方法。大多数语言都有 atan2 函数。其他三角题"Rotating a rectangle "& "How to calculate the angle between two points relative to the horizontal axis? "
DELTA_Y=$(($HEIGHT-155-534))
DELTA_X=$((784-659))
DEGREE=`awk "BEGIN { pi=4.0*atan2(1.0,1.0)+90; print atan2($DELTA_Y,$DELTA_X)*180/pi; }"`
convert copyOpacity.png -rotate $DEGREE -trim final.png
幸运的是,您可以一步完成所有事情。
#!/bin/bash
WIDTH=819
HEIGHT=616
TOP_LEFT=669,117
TOP_RIGHT=784,155
BOTTOM_LEFT=544,495
BOTTOM_RIGHT=659,534
DELTA_Y=$(($HEIGHT-155-534))
DELTA_X=$((784-659))
DEGREE=`awk "BEGIN { pi=4.0*atan2(1.0,1.0)+90; print atan2($DELTA_Y,$DELTA_X)*180/pi; }"`
convert source.jpg \( -size $WIDTHx$HEIGHT xc:black -fill white -stroke white \
-draw "polyline $TOP_LEFT $TOP_RIGHT $BOTTOM_RIGHT $BOTTOM_LEFT" \) \
-alpha Off -compose CopyOpacity -composite \
-background transparent -rotate $DEGREE -trim \
final.png
关于php - 按角度裁剪图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18288631/