2016-05-08 1 views
2

Je veux arrondir la première image et la fusionner avec la seconde.
Voici deux images que je veux fusionner.
First image which I want to round in circle second image where I wan to merge first imageFusionner deux images et un coin rond en PHP

Première image que je veux arrondir en cercle.
deuxième image où je voulais fusionner la première image
Voici un code que j'utilise à cet effet.

<?php 

$srcImg = '1.jpg'; 
$destImg = '2.jpg'; 
$dstX = 300; 
$dstY = 40; 
$srcX = 0; 
$srcY = 0; 
$srcW = 200; 
$srcH = 226; 
$pct = 100; 


$dest = imagecreatefromjpeg($destImg); 
$src = imageCreateCorners($srcImg,200); 

imagealphablending($dest, false); 
imagesavealpha($dest, true); 

imagecopymerge($dest, $src, $dstX, $dstY, $srcX, $srcY, $srcW, $srcH, $pct); 

header('Content-Type: image/png'); 
imagejpeg($dest); 

imagedestroy($dest); 
imagedestroy($src); 

function imageCreateCorners($sourceImageFile, $radius) { 
    # test source image 
    if (file_exists($sourceImageFile)) { 
     $res = is_array($info = getimagesize($sourceImageFile)); 
     } 
    else $res = false; 

    # open image 
    if ($res) { 
     $w = $info[0]; 
     $h = $info[1]; 
     switch ($info['mime']) { 
     case 'image/jpeg': $src = imagecreatefromjpeg($sourceImageFile); 
      break; 
     case 'image/gif': $src = imagecreatefromgif($sourceImageFile); 
      break; 
     case 'image/png': $src = imagecreatefrompng($sourceImageFile); 
      break; 
     default: 
      $res = false; 
     } 
     } 

    # create corners 
    if ($res) { 

     $q = 10; # change this if you want 
     $radius *= $q; 

     # find unique color 
     do { 
     $r = rand(0, 255); 
     $g = rand(0, 255); 
     $b = rand(0, 255); 
     } 
     while (imagecolorexact($src, $r, $g, $b) < 0); 

     $nw = $w*$q; 
     $nh = $h*$q; 

     $img = imagecreatetruecolor($nw, $nh); 
     $alphacolor = imagecolorallocatealpha($img, $r, $g, $b, 127); 
     imagealphablending($img, false); 
     imagesavealpha($img, true); 
     imagefilledrectangle($img, 0, 0, $nw, $nh, $alphacolor); 

     imagefill($img, 0, 0, $alphacolor); 
     imagecopyresampled($img, $src, 0, 0, 0, 0, $nw, $nh, $w, $h); 

     imagearc($img, $radius-1, $radius-1, $radius*2, $radius*2, 180, 270, $alphacolor); 
     imagefilltoborder($img, 0, 0, $alphacolor, $alphacolor); 
     imagearc($img, $nw-$radius, $radius-1, $radius*2, $radius*2, 270, 0, $alphacolor); 
     imagefilltoborder($img, $nw-1, 0, $alphacolor, $alphacolor); 
     imagearc($img, $radius-1, $nh-$radius, $radius*2, $radius*2, 90, 180, $alphacolor); 
     imagefilltoborder($img, 0, $nh-1, $alphacolor, $alphacolor); 
     imagearc($img, $nw-$radius, $nh-$radius, $radius*2, $radius*2, 0, 90, $alphacolor); 
     imagefilltoborder($img, $nw-1, $nh-1, $alphacolor, $alphacolor); 
     imagealphablending($img, true); 
     imagecolortransparent($img, $alphacolor); 

     # resize image down 
     $dest = imagecreatetruecolor($w, $h); 
     imagealphablending($dest, false); 
     imagesavealpha($dest, true); 
     imagefilledrectangle($dest, 0, 0, $w, $h, $alphacolor); 
     imagecopyresampled($dest, $img, 0, 0, 0, 0, $w, $h, $nw, $nh); 

     # output image 
     $res = $dest; 
     imagedestroy($src); 
     imagedestroy($img); 
     } 

    return $res; 
    } 
    ?> 

Ce code ne fonctionne pas bien pour moi. Il y a trois problèmes.
D'abord quand j'essaie de l'arrondir et d'augmenter radius il ne fera pas de cercle.
Deuxièmement, la couleur noire est créée automatiquement autour de l'image.
Troisièmement, ce code est deux lent.
Pouvez-vous s'il vous plaît m'aider à faire mieux.
Toute suggestion.

Répondre

1

par cannibaliser un previous answer of mine J'ai écrit ce qui suit:

<?php 

$srcImg = '1.jpg'; 
$destImg = '2.jpg'; 
$dstX = 300; 
$dstY = 40; 
$srcX = 0; 
$srcY = 0; 
//$srcW = 200; // replaced with $src_width 
//$srcH = 226; // replaced with $src_height 
$pct = 100; 

// create destination image resource. 
$dest = imagecreatefromjpeg($destImg); 
$dest_width = imagesx($dest); 
$dest_height = imagesy($dest); 

// create source image resource and define transparent colour. 
$src = imagecreatefromjpeg($srcImg); 
$src_width = imagesx($src); 
$src_height = imagesy($src); 
imagecolortransparent($src, imagecolorallocate($src, 255, 0, 255)); 

// create a circular mask and use it to crop the source image. 
$mask = imagecreatetruecolor($src_width, $src_height); 
$black = imagecolorallocate($mask, 0, 0, 0); 
$magenta = imagecolorallocate($mask, 255, 0, 255); 
imagefill($mask, 0, 0, $magenta); 
$r = min($src_width, $src_height); 
imagefilledellipse($mask, ($src_width/2), ($src_height/2), $r, $r, $black); 
imagecolortransparent($mask, $black); 
imagecopymerge($src, $mask, 0, 0, 0, 0, $src_width, $src_height, 100); 
imagedestroy($mask); 

// merge the two images to create the result. 
imagecopymerge($dest, $src, $dstX, $dstY, $srcX, 0, $src_width, $src_height, $pct); 

// output. 
header('Content-type: image/jpeg'); 
imagejpeg($dest); 
imagedestroy($src); 
imagedestroy($dest); 

Cette cultures correctement l'image source à un cercle et se confond avec la destination. Vous devrez ajuster le positionnement selon vos préférences.

enter image description here