在 PHP 中合并两个图像和圆角
Merge two images and round corner in PHP
我想对第一张图片进行舍入并将其与第二张图片合并。
这是我要合并的两张图片。
第一张我想画圆的图片。
我想合并第一张图片的第二张图片
这是我为此目的使用的代码。
<?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
$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);
这会正确地将源图像裁剪成圆形并将其与目标图像合并。您需要根据自己的喜好调整位置。
我想对第一张图片进行舍入并将其与第二张图片合并。
这是我要合并的两张图片。
第一张我想画圆的图片。
我想合并第一张图片的第二张图片
这是我为此目的使用的代码。
<?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
$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);
这会正确地将源图像裁剪成圆形并将其与目标图像合并。您需要根据自己的喜好调整位置。