指南:使用PHP和GD库
我有普通的照片(png | gif | jpeg),想剪出三角形。 为了便于我们假设我们想要分割4个部分的图像,每个三角形从 中央。你明白了吗?
使用GD绘制三角形的方式如下:
<?php
//create a white canvas
$im = @imagecreate(500, 500) or die("Cannot Initialize new GD image stream");
imagecolorallocate($im, 255, 255, 255);
//triangle
$t1 = rand(0,400);
$t2 = rand(0,400);
$t3 = rand(10,100);
$t4 = rand(10,100);
$points = array(
$t1, $t2,
($t1+$t3), $t2,
$t1, ($t2+$t4)
);
$trcol = imagecolorallocate($im, rand(0,255), rand(0,255), rand(0,255));
imagefilledpolygon($im, $points, 3, $trcol);
//make png and clean up
header("Content-type: image/png");
imagepng($im);
imagedestroy($im);
?>
现在我们实际上想要从已经存在的图片中剪切三角形。 我只知道如何从现有图片中删除矩形:
<?php
// Create image instances
$src = imagecreatefromgif('php.gif');
$dest = imagecreatetruecolor(80, 40);
// Copy
imagecopy($dest, $src, 0, 0, 20, 13, 80, 40);
// Output and free from memory
header('Content-Type: image/gif');
imagegif($dest);
imagedestroy($dest);
imagedestroy($src);
?>
PHP GD imagecopy bool imagecopy(资源$ dst_im,资源$ src_im,int $ dst_x,int $ dst_y,int $ src_x,int $ src_y,int $ src_w,int $ src_h)
那么我们如何将这两种方法结合起来做出意图呢?
答案 0 :(得分:1)
我确信x / y计算可以用这个进行更优化,但是它适用于从给定图像生成具有顶部/右/底部/左侧三角形的png,并将它们输出为具有透明背景的png -
// Set which triangle to generate
// top, right, bottom or left
$triangle = 'top';
// Load source image
$src = imagecreatefromjpeg ('Desert.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
switch ($triangle)
{
case 'top':
$destWidth = $srcWidth;
$destHeight = $centreY;
$destSX = 0;
$destSY = 0;
break;
case 'right':
$destWidth = $centreX;
$destHeight = $srcHeight;
$destSX = $centreX;
$destSY = 0;
break;
case 'bottom':
$destWidth = $srcWidth;
$destHeight = $centreY;
$destSX = 0;
$destSY = $centreY;
break;
case 'left':
$destWidth = $centreX;
$destHeight = $srcHeight;
$destSX = 0;
$destSY = 0;
break;
}
// Create the image
$dest = imagecreatetruecolor ($destWidth, $destHeight);
// Copy from source
imagecopy ($dest, $src, 0, 0, $destSX, $destSY, $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);
imagecolortransparent ($dest, $colRed);
switch ($triangle)
{
case 'top':
imagefilledpolygon ($dest, array ($centreX, $destHeight, 0, 0, 0, $destHeight), 3, $colRed);
imagefilledpolygon ($dest, array ($centreX, $destHeight, $destWidth, 0, $destWidth, $destHeight), 3, $colRed);
break;
case 'right':
imagefilledpolygon ($dest, array (0, $centreY, 0, 0, $destWidth, 0), 3, $colRed);
imagefilledpolygon ($dest, array (0, $centreY, 0, $destHeight, $destWidth, $destHeight), 3, $colRed);
break;
case 'bottom':
imagefilledpolygon ($dest, array ($centreX, 0, 0, 0, 0, $destHeight), 3, $colRed);
imagefilledpolygon ($dest, array ($centreX, 0, $destWidth, 0, $destWidth, $destHeight), 3, $colRed);
break;
case 'left':
imagefilledpolygon ($dest, array ($destWidth, $centreY, 0, 0, $destWidth, 0), 3, $colRed);
imagefilledpolygon ($dest, array ($destWidth, $centreY, 0, $destHeight, $destWidth, $destHeight), 3, $colRed);
break;
}
// Output new image
header ('Content-Type: image/png');
imagepng ($dest);
// Clean up
imagedestroy ($src);
imagedestroy ($dest);