【问题标题】:Merge two images and round corner in PHP在PHP中合并两个图像和圆角
【发布时间】:2016-09-02 23:07:09
【问题描述】:

我想对第一张图像进行四舍五入并将其与第二张图像合并。
这是我要合并的两张图片。

我想圈成圆形的第一张图片。
我想合并第一张图片的第二张图片
这是我为此目的使用的代码。

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

这段代码不适合我。存在三个问题。
首先,当我尝试将其舍入并增加radius 时,它不会形成一个圆圈。
其次,图像周围会自动创建黑色。
三、这段代码慢了两点。
你能帮我把它做得更好吗。
任何建议。

【问题讨论】:

    标签: php image merge php-gd


    【解决方案1】:

    通过蚕食previous answer of mine,我写了以下内容:

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

    这会正确地将源图像裁剪为圆形并将其与目标图像合并。您需要根据自己的喜好调整位置。

    【讨论】:

      猜你喜欢
      • 2012-10-10
      • 2012-02-10
      • 1970-01-01
      • 2011-04-22
      • 2014-05-01
      • 2011-05-21
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多