我有2个源图像和欲:PHP GD如何圆形作物3个方形图像和合并成1个图像保持透明
- 执行每个图像的圆形作物,与圆透明的外
- 将所有图像合并/复制回目标透明图像。
我试过many examples,但似乎无法在最终图像上保持透明度。
我想实现这样的事情:
这是输出我得到的一个例子:
这是我的circle_crop功能:
function create_circle($img_path) {
// Attribution: by NerdsOfTech
// Step 1 - Start with image as layer 1 (canvas).
if (! $img1 = $this->imageCreateFromAny($img_path)) {
return FALSE;
}
$x=imagesx($img1);
$y=imagesy($img1);
// Step 2 - Create a blank image.
$img2 = imagecreatetruecolor($x, $y);
$bg = imagecolorallocate($img2, 255,0,255, 127); // wierdo pink background
// $bg = imagecolorallocate($img2, 0, 0, 0, 127); // white background
imagefill($img2, 0, 0, $bg);
imagecolortransparent($img2, $bg);
// Step 3 - Create the ellipse OR circle mask.
$e = imagecolorallocate($img2, 255, 255, 255); // black mask color
// Draw a ellipse mask
imagefilledellipse ($img2, ($x/2), ($y/2), $x, $y, $e);
// OR
// Draw a circle mask
// $r = $x <= $y ? $x : $y; // use smallest side as radius & center shape
// imagefilledellipse ($img2, ($x/2), ($y/2), $r, $r, $e);
// Step 4 - Make shape color transparent
imagecolortransparent($img2, $e);
// Step 5 - Merge the mask into canvas with 100 percent opacity
imagecopymerge($img1, $img2, 0, 0, 0, 0, $x, $y, 100);
// Step 6 - Make outside border color around circle transparent
imagecolortransparent($img1, $bg);
/* Clean up memory */
imagedestroy($img2);
return $img1;
}
这里的我通过调用circle_crop函数返回裁剪后的图像并将其合并到我的目标图像上,从而传递图像URL数组中的代码。
function generate_collage($img_name_path_array, $effect = 'POLAROID') {
$base_img_width = 800;
$base_img_height = 650;
if (empty($img_name_path_array)) {
error_log('Image name_path_array is blank?'.PHP_EOL);
return FALSE;
}
$effect = strtoupper($effect);
/* Create canvas */
$collage_img = imagecreatetruecolor($base_img_width, $base_img_height);
imagealphablending($collage_img, false);
imagesavealpha($collage_img,true);
/* Create alpha channel for transparent layer */
$trans_col=imagecolorallocatealpha($collage_img,255,255,255, 127);
/* Create overlapping transparent layer */
imagefilledrectangle($collage_img,0,0,$base_img_width,$base_img_height,$trans_col);
/* Continue to keep layers transparent */
imagealphablending($collage_img,true);
$size_reduction = .80;
$start_size = 100;
foreach ($img_name_path_array as $image_array) {
$img_text = $image_array[0];
$img_path = $image_array[1];
if (! empty($img_path)) {
switch ($effect) {
/* Add other collage image effects here */
case 'POLAROID' : {
$temp_img = $this->create_polaroid($img_path, $img_text, TRUE);
break;
}
case 'CIRCLES' : {
// $temp_img = $this->circle_crop($img_path);
$temp_img = $this->create_circle($img_path);
break;
}
default : {
/* Default to polaroid for now */
$temp_img = $this->create_polaroid($img_path, $img_text, TRUE);
break;
}
}
if ($temp_img) {
/* Get original height and width paramaters */
$source_w = imagesx($temp_img);
$source_h = imagesy($temp_img);
/* Randomise X and Y coordinates */
$random_x_pos = rand(0, (int) ($base_img_width * .66));
$random_y_pos = rand(0, (int) ($base_img_height * .3));
/* Randomise image size */
$start_size = ($start_size * $size_reduction);
$random_img_size_ratio = $start_size/100;
/* Add generated image to base collage image */
imagecopyresampled($collage_img, $temp_img, $random_x_pos, $random_y_pos, 0, 0, ($base_img_width * $random_img_size_ratio), ($base_img_height * $random_img_size_ratio), $source_w, $source_h);
imagecolortransparent($collage_img, $trans_col);
/* Keep transparent when saving */
imagesavealpha($collage_img,true);
/* Memory clean up */
imagedestroy($temp_img);
// break;
}
}
}
/* Now display PNG to browser */
$this->show_png_from_image_object($collage_img);
}
这是我的显示功能:
function show_png_from_image_object($img_obj) {
header ('Content-Type: image/png');
/* Display PNG with max compression */
imagepng ($img_obj, NULL, 9, PNG_ALL_FILTERS);
imagedestroy ($img_obj);
}
我已经把我的头发了2天,所以任何指针将不胜感激。
谢谢,杰森。
看看[这](http://stackoverflow.com/questions/29162633/create-ellipse-using-php)可以帮助 –
@tiGer - 不知道如何帮助? – Jason
请问您可以添加'create_polaroid','create_circle'和'show_png_from_image_object'的代码吗? –