2009-06-29 5 views
6

Existe-t-il un moyen raisonnablement simple de copier une zone circulaire d'une ressource d'image à une autre? Quelque chose comme imagecopymerge sauf avec des cercles ou des ovales, etc?
Si possible, je veux éviter d'avoir à utiliser des fichiers image pré-créés (toute forme ovale devrait être possible), et s'il y a des couleurs de transparence impliquées, ils devraient naturellement laisser le reste de l'image seul.PHP/GD, comment copier un cercle d'une image à l'autre?

Raison Je demande, j'ai quelques classes qui permettent d'appliquer des opérations d'image dans une "zone sélectionnée" d'une image, qui fonctionne en supprimant d'abord cette zone d'une copie de l'image, puis en recouvrant la copie sur l'original. Mais que se passe-t-il si vous voulez sélectionner un rectangle, puis à l'intérieur qui désélectionne un cercle et que les opérations n'affectent que la zone restante?

+0

Est-ce que la réponse de phalacee résoudre votre problème? Cette page est pointée par une [question actuelle] (http://stackoverflow.com/questions/14900727/how-to-cut-a-part-of-the-image-and-paste-it-toother -using-php), il serait donc bon de savoir si cela a fonctionné. – halfer

Répondre

8

Vous pouvez essayer ceci:

  1. Démarrer avec l'image originale - $ img
  2. Copier cette image à un .png - $ copie
  3. Créer un masque .png image de la zone que vous voulez dans le cercle/ellipse (une image 'magicpink' avec une forme noire dessus, avec un noir sur la couleur de la transparence alpha) - $ mask
  4. Copier $ masque sur le dessus de $ copy en maintenant la transparence Alpha
  5. Changez ce que vous besoin de $ copy
  6. copie $ copier à nouveau $ img maintenant la transparence 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); 
+0

"3. Créez une image png masque de la zone que vous voulez dans le cercle/ellipse (une image noire avec une forme blanche, avec un ensemble noir à la couleur de la transparence alpha) - $ masque. le haut de $ firstcopy maintenant la transparence Alpha. " Est-ce que je n'ai pas l'image originale avec un cercle noir ou blanc? Ou une image transparente avec un cercle noir ou blanc? De plus, s'il y a du noir ou du blanc dans la sélection elle-même, cela ne va-t-il pas mal à l'étape finale de la fusion? – MSpreij

+0

@MSpreij J'ai ajouté un exemple de code avec des détails sur ce que vous devez faire ... Je l'ai testé et je sais que ça marche aussi – jsnfwlr

+0

Merci! Je vais essayer plus tard ce soir. – MSpreij

Questions connexes