2011-08-17 2 views
1
에서 삼각형을 잘라

지침 : 사용하여 PHP와 GD 라이브러리PHP GD는 사진

내가 평범한 사진이 (PNG | GIF | JPEG)를 삼각형을 잘라 싶다. 편리하게하려면 이미지를 4 부분으로 자르고, 각각의 삼각형은 센터에서부터 시작한다고 가정합니다. 알 겠어? GD와

Illustration rectangle to 4 triangles

회화 삼각형은 다음과 같이 진행됩니다

<?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 부울 imagecopy (자원 $의 dst_im, 자원 $ src_im, INT $ dst_x, INT $ dst_y, INT $ src_x, int $ src_y, int $ src_w, int $ src_h)

의도적 인 작업을 수행하기 위해이 두 가지 방법을 어떻게 조합합니까?

답변

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); 
+0

안녕 Andy. 매우 훌륭하고 똑똑한 기여에 감사드립니다. 나는 삼각형을 잘라 내지 않더라도 당신의 접근 방식을 좋아합니다. 그러나 아마 php로 gd 라이브러리를 사용하는 이미지에서 rectangulares보다 다른 모양을 잘라낼 수도 없습니다. 그렇지? 나는 우리가 imagemagick을 상담해야만하는 그런 목적을 위해 두려워한다. PHP는 기본 설치가 아니다. 나는 똑똑한 작업 환경이 있기를 바랄지라도. – Email

+0

이 솔루션은 어떻게 이미지에 상관없이 정삼각형을 만들 수 있습니까? (스케일링과 품질 손실은 문제가되지 않는다) ?? 감사 – Owen