2009-06-29 16 views
6

¿Existe una forma razonablemente sencilla de copiar un área circular de un recurso de imagen a otro? Algo como imagecopymerge excepto con círculos u óvalos, etc.
Si es posible, quiero evitar tener que usar archivos de imagen creados previamente (cualquier forma ovalada debería ser posible), y si hay colores de transparencia involucrados, deberían dejar el resto de la imagen de forma natural.PHP/GD, ¿cómo copiar un círculo de una imagen a otra?

Motivo que estoy preguntando, tengo algunas clases que permiten aplicar operaciones de imagen dentro de un "área seleccionada" de una imagen, que funciona borrando primero esa área de una copia de la imagen, luego superponiendo la copia en el original. Pero, ¿qué sucede si desea seleccionar un rectángulo, y luego dentro de eso, anular la selección de un círculo y hacer que las operaciones solo afecten al área que queda?

+0

dio respuesta de phalacee resolver su problema? Esta página está siendo apuntada por una [pregunta actual] (http://stackoverflow.com/questions/14900727/how-to-cut-a-part-of-the-image-and-paste-it-to-another -using-php), por lo que sería bueno saber si funcionó. – halfer

Respuesta

8

Usted podría intentar esto:

  1. de inicio imagen original con - $ img
  2. Copia esa imagen a un png - $ copiar
  3. crear una máscara de imagen de la zona png que desea en el círculo/elipse (una imagen 'magicpink' con una forma negra, con el color negro de transparencia alfa) - $ máscara
  4. Copia $ máscara en la parte superior de $ copia manteniendo la transparencia Alpha
  5. Cambie lo que necesidad de $ copy
  6. Copiar $ copiar hacia atrás sobre $ img mantener la transparencia alfa

    // 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. Cree una imagen png de máscara del área que desea en el círculo/elipse (una imagen negra con una forma blanca, con negro configurado en el color de transparencia alfa) - $ máscara 4. Copie $ máscara sobre la parte superior de $ firstcopy manteniendo la transparencia alfa ". ¿Ahora no tengo la imagen original con un círculo negro o blanco en ella? ¿O una imagen transparente con un círculo negro o blanco? Además, si hay negro o blanco en la selección en sí, ¿no saldrá mal en la etapa final al fusionar todo de nuevo? – MSpreij

+0

@MSpreij He agregado un ejemplo de código con detalles sobre lo que debe hacer ... Lo he probado y sé que también funciona – jsnfwlr

+0

¡Gracias! Lo intentaré más tarde esta noche. – MSpreij

Cuestiones relacionadas