PHP / GD,如何将圆圈从一个图像复制到另一个图像?

时间:2009-06-29 00:14:41

标签: php image gd selection geometry

是否有一种将圆形区域从一个图像资源复制到另一个图像资源的相当简单的方法?像imagecopymerge之类的东西,除了圆圈或椭圆形等等? 如果可能的话,我想避免使用预先创建的图像文件(应该可以使用任何椭圆形状),如果涉及透明度颜色,它们应该自然地保留图像的其余部分。

我要问的原因是,我有一些类允许在图像的“选定区域”内应用图像操作,其工作方式是首先从图像副本中删除该区域,然后将副本重叠原本的。但是,如果你想选择一个矩形,然后在里面取消选择一个圆圈,让操作只影响剩下的区域呢?

1 个答案:

答案 0 :(得分:8)

你可以试试这个:

  1. 从原始图片开始 - $ img
  2. 将该图像复制到png - $ copy
  3. 在圆圈/椭圆中创建所需区域的蒙版png图像(上面带有黑色形状的'magicpink'图像,黑色设置为Alpha透明度的颜色) - $ mask
  4. 将$ mask复制到$ copy的顶部,保持Alpha透明度
  5. 在$ copy上更改您需要的内容
  6. 将$ copy复制回$ img,保持Alpha透明度
  7. 
        // 1. Start with the original image  
        $img = imagecreatefromjpeg("./original.jpg");  
        $img_magicpink = imagecolorallocatealpha($img, 255, 0, 255, 127);  
        //imagecolortransparent($img, $img_magicpink);  
    
        // (Get its dimensions for copying)  
        list($w, $h) = getimagesize("./original.jpg");  
    
        // 2. Create the first copy  
        $copy = imagecreatefromjpeg("./original.jpg");  
        imagealphablending($copy, true);  
    
        $copy_magicpink = imagecolorallocate($copy, 255, 0, 255);  
        imagecolortransparent($copy, $copy_magicpink);  
    
        // 3. Create the mask  
        $mask = imagecreatetruecolor($w, $h);  
        imagealphablending($mask, true);  
    
        // 3-1. Set the masking colours  
        $mask_black = imagecolorallocate($mask, 0, 0, 0);  
        $mask_magicpink = imagecolorallocate($mask, 255, 0, 255);  
        imagecolortransparent($mask, $mask_black);  
        imagefill($mask, 0, 0, $mask_magicpink);  
    
        // 3-2. Draw the circle for the mask  
        $circle_x = $w/2;  
        $circle_y = $h/2;  
        $circle_w = 150;  
        $circle_h = 150;  
        imagefilledellipse($mask, $circle_x, $circle_y, $circle_w, $circle_h, $mask_black);  
    
        // 4. Copy the mask over the top of the copied image, and apply the mask as an alpha layer  
        imagecopymerge($copy, $mask, 0, 0, 0, 0, $w, $h, 100);  
    
    
        // 5. Do what you need to do to the image area  
        // My example is turning the original image gray and leaving the masked area as colour  
        $x = imagesx($img);  
        $y = imagesy($img);  
        $gray = imagecreatetruecolor($x, $y);  
        imagecolorallocate($gray, 0, 0, 0);  
        for ($i = 0; $i > 16) & 0xFF;  
            $g = ($rgb >> 8) & 0xFF;  
            $b = $rgb & 0xFF;  
             //for gray mode $r = $g = $b  
            $color = max(array($r, $g, $b));  
            $gray_color = imagecolorexact($img, $color, $color,   $color);  
            imagesetpixel($gray, $i, $j, $gray_color);  
          }  
        }  
    
        // 6. Merge the copy with the origianl - maintaining alpha  
        imagecopymergegray($gray, $copy, 0, 0, 0, 0, $w, $h, 100);  
        imagealphablending($gray, true);  
        imagecolortransparent($gray, $mask_magicpink);  
    
        header('Content-Type: image/png');  
        imagepng($gray);  
        imagedestroy($gray);