2009-06-29 2 views
6

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

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

+0

ли ответ phalacee в решить вашу проблему? На этой странице указывается [текущий вопрос] (http://stackoverflow.com/questions/14900727/how-to-cut-a-part-of-the-image-and-paste-it-to-another -using-php), поэтому было бы хорошо знать, сработало ли это. – halfer

ответ

8

Вы можете попробовать это:

  1. Начните с исходного изображения - $ IMG
  2. Скопируйте этот образ в формате PNG - $ скопировать
  3. Создать маску PNG изображение области, которую вы хотите в круг/ellipse (изображение «magicpink» с черной фигурой на нем, с черным, установленным на цвет альфа-прозрачности) - $ mask
  4. Копировать $ маску поверх $ copy, поддерживая прозрачность Alpha
  5. Изменить то, что вы нужно на $ copy
  6. Copy $ скопировать обратно на $ IMG сохранении прозрачности альфа

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

"3. Создайте маску png изображения области, которую вы хотите в круге/эллипсе (черное изображение с белой фигурой на нем, с черным, установленным на цвет альфа-прозрачности) - $ mask. 4. Скопируйте $ mask поверх вершина $ firstcopy, поддерживающая прозрачность Alpha. " Разве у меня нет исходного изображения с черным или белым кругом? Или прозрачное изображение с черным или белым кругом? Кроме того, если в самом выборе есть черный или белый, разве это не будет ошибкой на последнем этапе, когда все снова слияние? – MSpreij

+0

@MSpreij Я добавил образец кода с подробностями о том, что вам нужно сделать ... Я протестировал его и знаю, что он работает тоже – jsnfwlr

+0

Спасибо! Я попробую это позже вечером. – MSpreij

Смежные вопросы