PHP / GD,如何将圆圈从一个图像复制到另一个图像? [英] PHP/GD, how to copy a circle from one image to another?
问题描述
是否有一种合理简单的方法将圆形区域从一个图像资源复制到另一个图像资源?像 imagecopymerge 之类的东西,除了圆圈或椭圆形等等?
如果可能的话,我想避免使用预先创建的图像文件(任何椭圆形状都应该是可能的),如果涉及透明度颜色,它们应该自然地保留图像的其余部分。
Is there a reasonably straightforward way to copy a circular area from one image resource to another? Something like imagecopymerge except with circles or ovals etc?
If possible, I want to avoid having to use pre-created image files (any oval shape should be possible), and if there's transparency colours involved they should naturally leave the rest of the image alone.
我问的原因,我有一些类允许在图像的选定区域内应用图像操作,首先从图像的副本中删除该区域,然后将副本重叠在原件上。但是如果你想选择一个矩形,然后在里面取消选择一个圆圈,让操作只影响剩下的区域呢?
Reason I'm asking, I have a few classes that allow to apply image operations inside a "selected area" of an image, which works by first deleting that area from a copy of the image, then overlaying the copy back on the original. But what if you want to select a rectangle, and then inside that deselect a circle, and have the operations only affect the area that's left?
推荐答案
你可以试试这个:
- 从原始图片开始 - $ img
- 复制该图像为png - $ copy
- 在圆圈/椭圆中创建所需区域的蒙版png图像(上面带有黑色形状的'magicpink'图像,带黑色图像到alpha透明度的颜色) - $ mask
- 将$ mask复制到$ copy的顶部,保持Alpha透明度
- 更改你需要的内容on $ copy
- 将$ copy复制回$ img以维持Alpha透明度
- Start with original image - $img
- Copy that image to a png - $copy
- Create a mask png image of the area you want in the circle/ellipse (a 'magicpink' image with a black shape on it, with black set to the colour of alpha transparency) - $mask
- Copy $mask over the top of $copy maintaining the Alpha transparency
- Change what you need to on $copy
- Copy $copy back over $img maintaining the Alpha transparency
// 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);
这篇关于PHP / GD,如何将圆圈从一个图像复制到另一个图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!