php - 按角度裁剪图像

标签 php imagemagick gd

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

因此,如果您可以对此成像,则上传图像,1280x720。 连同图像一起提供了裁剪区域的 x,x 坐标。 然而,左上角和右上角的坐标不会有相同的 y 位置。

举个例子

之前

Before

之后

After

有什么想法吗?

最佳答案

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

首先。创建图像 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

Image mask of area to crop

遮蔽和背景去除

masking的这个方法将关闭 alpha channel 并将背景设置为透明。当我们合成两个图像时,生成的图像将只显示我们在 mask 中定义的区域内的内容。 (注意:您可能需要将 -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

关于php - 按角度裁剪图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18288631/

相关文章:

c# - 将 ImageMagick 集成到现有的 Visual Studio C# 解决方案中

php - 尝试使用 PNG 和 JPEG 支持构建 PHP 和 GD

php - 如何为 PHP 格式化 Bootstrap DatePicker

php - 尝试将以太网盾连接到本地 apache 服务器

php - 在文本上放置阴影

perl - 无法使用 cpan 在 darwin 13.0.1 上安装 GD 模块

php - 如何将非英语字符(如阿拉伯语或波斯语字符)写入图像?

javascript - 在数组中存储具有不同 id 的多个值 - php、javascript

php - CodeIgniter - 如何从 URL 中隐藏 index.php

java - 无法加载库 'gs' : libgs. 所以:无法打开共享对象文件:没有这样的文件或目录