我注意到有一些脚本要尝试这样做,但是没有完全不同的情况。
我已经找到了一些我发现的脚本,试图找到正确的解决方案。
但是我现在遇到了两个问题。
演示位于http://owenmelbourne.com/triangle.php
代码是
$src = imagecreatefromjpeg ('http://uat.eruptedevents.secureping.co.uk/media/images/upload/1200/154.jpg');
// Get image width/height
$srcWidth = imagesx ($src);
$srcHeight = imagesy ($src);
// Get centre position
$centreX = floor ($srcWidth / 2);
$centreY = floor ($srcHeight / 2);
// Set new image size and start x/y
$destWidth = $srcWidth;
$destHeight = $srcHeight;
$destSX = 0;
$destSY = $centreY;
// Create the image
$square = 500;
if( $srcWidth >= $srcHeight ){
$square = $srcHeight;
}
else {
$square = $srcWidth;
}
$shift = array ("left" => 0, "top" => 0);
$shift["left"] = ( $srcWidth / 4 ) * -1;
$shift["top"] = ( $srcHeight / 4 ) * -1;
$dest = imagecreatetruecolor ($square, $square);
// Copy from source
imagecopy ($dest, $src, $shift["left"], $shift["top"], 0, 0, $destWidth, $destHeight);
// OK... we now have the correctly sized rectangle copied over from the source image
// Lets cut it down and turn it into the triangle we want by removing the other triangles
// We remove the area by defining another colour as transparent and creating shapes with that colour
$colRed = imagecolorallocatealpha ($dest, 255, 0, 0, 0);
$blue = imagecolorallocatealpha ($dest, 0, 0, 244, 0);
imagecolortransparent ($dest, $colRed);
$sidelength = $square;
imagefilledpolygon ($dest, array (
0, 0,
$square/2, 0,
0, $square
), 3, $colRed);
imagefilledpolygon ($dest, array (
$square, 0,
$square, $square,
$square/2, 0
), 3, $colRed);
$dest2 = imagecreatetruecolor ($square, $square);
// Output new image
header ('Content-Type: image/png');
imagepng ($dest);
// Clean up
imagedestroy ($thumbNail);
imagedestroy ($dest);
我如何从中间拍摄完美的三角形裁剪,并将其作为图像返回?
非常感谢
答案 0 :(得分:2)
右边,假设你想要一个矩形内的最大尺寸等边三角形,平面与水平轴平行,即。最上面的点,然后根据矩形的纵横比有两种情况。
在这种情况下,矩形的高度是限制因素。
的任务是确定该三角形的边的长度,并用它来发现的三角形的两个底点的位置,通过从矩形的中点取一半的长度远。
如果我们调用图表上标记的三角形长度e
(同时g
和f
),则矩形的高度标记为a
,然后快速的三角学说明:
sin 60 = opp / hyp = a / e = sqrt(3) / 2
所以
e = 2a / sqrt(3)
水平方面我们可以在图中调用b
,中点显然位于b / 2
,因此三角形底边的点位于[ (b / 2) ± (e / 2) , 0 ]
。< / p>
要执行裁剪,请执行以下步骤:
- 创建与源
大小相同的新图像- 填充整个目的地透明
- 将三角形的两个基点之间的一个矩形复制到整个高度的同一位置 目的地
- 从三角形的两个基点两侧填充透明三角形到三角形的三角形顶部 它们到矩形顶部的中点
醇>
在这种情况下,宽度是限制因素。
因此,三角形边的长度是矩形的宽度,因此是已知的。需要计算的是三角形的高度。
如果我们调用图中标记的高度H
和前面的宽度b
,那么简单的三角函数表示:
sin 60 = opp / hyp = H / b = sqrt(3) / 2
所以
H = b x sqrt(3) / 2
我们可以在图中调用a
的垂直边,中点位于a / 2
,因此三角形底边的点位于[ 0 , (a / 2) + (H / 2) ]
和{{ 1}}并且三角形[ b , (a / 2) + (H / 2) ]
的顶端位于E
。
要执行裁剪,请执行以下步骤(最初是两个 与以前相同的步骤):
- 创建与源
大小相同的新图像- 填充整个目的地透明
- 从三角形
[ (b / 2) , (a / 2) - (H / 2) ]
的基座和尖端之间的全宽源复制矩形到目标中的相同位置- 从三角形的两个基点两侧填充透明的三角形,到三角形尖端
醇>E
到点上的三角形 在与基点相同的一侧与E
处于同一高度的边缘 有问题的三角形
NB。在你有一个正方形的情况下,任何一个计算都应该有效,虽然景观计算对我来说似乎更简单,所以我会用它。
改编自你自己,所以不是我常用的编码风格,但它有效。由于透明度在GD中有点痛苦,所以花了一段时间。
<强>原始强>
裁剪 (使用以下代码创建)
E
答案 1 :(得分:0)
ImageArtist是GD的包装器,可以让我为开发人员轻松搞定。您可以使用它来创建任何类型的多边形
$triangle = new Triangle("http://i.stack.imgur.com/YlnCJ.jpg");
$triangle->setPointA(50,0,true);
$triangle->setPointB(100,100,true);
$triangle->setPointC(0,100,true);
$triangle->build();
$triangle->dump(); //this is for debugging only read documentation for more operations
最终输出看起来像这样