裁剪角度的图像

时间:2013-08-17 12:08:32

标签: php imagemagick gd

我目前正在寻找一种裁剪图像的方法,但是从一个角度来看。 我不认为我可以先旋转图像,因为脚本提供了每个角落的特定x,y坐标。

因此,如果您可以对此进行成像,则会上传图像,1280x720。 与图像一起,它为裁剪区提供x,x坐标。 但是,左上角和右上角坐标的y位置不同。

下面是一个例子

Before

After

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

您仍然需要使用三角法旋转图像,但您可以通过混合不透明度复制和修剪来模拟一个角度裁剪。

首先。创建图像蒙版

如果所有点都给你,并且图像大小已定义,只需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

Image mask of area to crop

屏蔽和背景消除

masking方法将关闭Alpha通道并将背景设置为透明。当我们合成两个图像时,生成的图像将仅显示我们在蒙版中定义的区域内的内容。 (注意:您可能需要将-background调整为白色或透明。)

convert source.jpg mask.png -alpha Off -compose CopyOpacity \
        -composite -background transparent copyOpacity.png

Opacity copied from composite mask

计算旋转度

如果在方角上有两个点,则应该能够遵循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

enter image description here

幸运的是,你可以一步到位地完成所有事情。

#!/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