PHP / GD, как скопировать круг из одного изображения в другое?

Есть ли достаточно простой способ скопировать круговую область из одного ресурса изображения в другой? Что-то вроде imagecopymerge, за исключением кругов или овалов и т. Д.?
Если возможно, я хочу избежать использования предварительно созданных файлов изображений (любая овальная форма должна быть возможной), и если есть прозрачность цвета, они должны, естественно, оставить остальную часть изображения в одиночку.

Причина, о которой я спрашиваю, у меня есть несколько классов, которые позволяют применять операции изображения внутри «выбранной области» изображения, которое работает, сначала удаляя эту область из копии изображения, а затем накладывая копию на оригинал. Но что, если вы хотите выбрать прямоугольник, а затем внутри, чтобы отменить выбор круга, и чтобы операции влияли только на оставшуюся область?

    Вы можете попробовать следующее:

    1. Начать с оригинального изображения – $ img
    2. Скопируйте это изображение в png – $ copy
    3. Создайте маску png изображения области, которую вы хотите, в круге / эллипсе (изображение «волшебного пинка» с черной фигурой на нем, с черным цветом, на цвет альфа-прозрачности) – $ mask
    4. Скопируйте $ mask поверх вершины $ copy, поддерживая прозрачность Alpha.
    5. Измените то, что вам нужно, на $ copy
    6. Скопировать $ copy обратно за $ img, поддерживая прозрачность Alpha
    // 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);