PHP GD вырезать треугольник из картинки - PullRequest
1 голос
/ 17 августа 2011

Рекомендации: использование библиотеки PHP и GD

У меня есть обычные картинки (png | gif | jpeg) и я хочу вырезать треугольники. Для облегчения предположим, что мы хотим разрезать изображения на 4 части, каждый треугольник начинается с центр. Ты понял?

Illustration rectangle to 4 triangles

Рисование треугольников с помощью 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)

Итак, как нам объединить эти два подхода, чтобы сделать то, что намеревается?

1 Ответ

1 голос
/ 17 августа 2011

Я уверен, что вычисление 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);
...