PHP GD三角形图像裁剪

时间:2013-06-11 16:48:59

标签: php geometry gd crop

我注意到有一些脚本要尝试这样做,但是没有完全不同的情况。

我已经找到了一些我发现的脚本,试图找到正确的解决方案。

但是我现在遇到了两个问题。

  1. 图像未居中。
  2. 三角形的边长不相等。
  3. 演示位于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);
    

    我如何从中间拍摄完美的三角形裁剪,并将其作为图像返回?

    非常感谢

2 个答案:

答案 0 :(得分:2)

矩形中的等边三角形

右边,假设你想要一个矩形内的最大尺寸等边三角形,平面与水平轴平行,即。最上面的点,然后根据矩形的纵横比有两种情况。


横向矩形(宽度>高度)

Equilateral Triangle in Rectangle - Landscape

在这种情况下,矩形的高度是限制因素。

的任务是确定该三角形的边的长度,并用它来发现的三角形的两个底点的位置,通过从矩形的中点取一半的长度远。

如果我们调用图表上标记的三角形长度e(同时gf),则矩形的高度标记为a ,然后快速的三角学说明:

sin 60 = opp / hyp = a / e = sqrt(3) / 2

所以

e = 2a / sqrt(3)

水平方面我们可以在图中调用b,中点显然位于b / 2,因此三角形底边的点位于[ (b / 2) ± (e / 2) , 0 ]。< / p>

  

要执行裁剪,请执行以下步骤:

     
      
  1. 创建与源
  2. 大小相同的新图像   
  3. 填充整个目的地透明
  4.   
  5. 将三角形的两个基点之间的一个矩形复制到整个高度的同一位置   目的地
  6.   
  7. 从三角形的两个基点两侧填充透明三角形到三角形的三角形顶部   它们到矩形顶部的中点
  8.   

纵向矩形(宽度<高度)

Equilateral Triangle in Rectangle - Portrait

在这种情况下,宽度是限制因素。

因此,三角形边的长度是矩形的宽度,因此是已知的。需要计算的是三角形的高度。

如果我们调用图中标记的高度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

  

要执行裁剪,请执行以下步骤(最初是两个   与以前相同的步骤):

     
      
  1. 创建与源
  2. 大小相同的新图像   
  3. 填充整个目的地透明
  4.   
  5. 从三角形[ (b / 2) , (a / 2) - (H / 2) ]的基座和尖端之间的全宽源复制矩形到目标中的相同位置
  6.   
  7. 从三角形的两个基点两侧填充透明的三角形,到三角形尖端E到点上的三角形   在与基点相同的一侧与E处于同一高度的边缘   有问题的三角形
  8.   

NB。在你有一个正方形的情况下,任何一个计算都应该有效,虽然景观计算对我来说似乎更简单,所以我会用它。


代码

改编自你自己,所以不是我常用的编码风格,但它有效。由于透明度在GD中有点痛苦,所以花了一段时间。

<强>原始

Junior Gorg with Lantern

裁剪 (使用以下代码创建)

Junior Gorg with Lantern - triangle cropped

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

最终输出看起来像这样

enter image description here