2016-05-08 14 views
2

Ich möchte das erste Bild runden und es mit Sekunde zusammenführen.
Hier sind zwei Bilder, die ich zusammenführen möchte.
First image which I want to round in circle second image where I wan to merge first imageMischen Sie zwei Bilder und runde Ecke in PHP

erstes Bild, das ich abzurunden im Kreis will.
zweites Bild, wo ich zuerst Bild einbinden möchte
Hier ist ein Code, den ich für diesen Zweck verwende.

<?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; 
    } 
    ?> 

Dieser Code funktioniert nicht gut für mich. Es gibt drei Probleme.
Zuerst, wenn ich versuche, es zu runden und radius zu erhöhen, wird es keinen Kreis bilden.
Zweitens, schwarze Farbe wird automatisch rund um das Bild erstellt.
Drittens, Dieser Code ist zwei langsam.
Können Sie mir bitte helfen, es besser zu machen.
Jeder Vorschlag.

Antwort

1

Durch eine previous answer of mine kannibalisieren ich geschrieben habe folgendes:

<?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); 

Diese Kulturen richtig das Quellbild zu einem Kreis und verschmilzt sie mit dem Ziel. Sie müssen die Positionierung nach Ihren Wünschen anpassen.

enter image description here