WIN-2308041133\Administrator 5 дней назад
Родитель
Сommit
b26280bc07
1 измененных файлов с 24 добавлено и 15 удалено
  1. 24 15
      crmeb/services/UtilService.php

+ 24 - 15
crmeb/services/UtilService.php

@@ -340,19 +340,25 @@ class UtilService
 
                 // 如果是圆形,先创建圆形图片
                 if ($val['circle']) {
+                    // 创建一个新的画布用于圆形头像
                     $canvas = imagecreatetruecolor($val['width'], $val['height']);
-                    imagefill($canvas, 0, 0, imagecolorallocatealpha($canvas, 0, 0, 0, 127));
+
+                    // 创建透明背景
+                    imagesavealpha($canvas, true);
+                    $transparent = imagecolorallocatealpha($canvas, 0, 0, 0, 127);
+                    imagefill($canvas, 0, 0, $transparent);
 
                     // 创建圆形蒙版
                     $mask = imagecreatetruecolor($val['width'], $val['height']);
-                    $transparent = imagecolorallocate($mask, 255, 0, 0);
-                    imagecolortransparent($mask, $transparent);
-                    imagefill($mask, 0, 0, $transparent);
+                    imagefill($mask, 0, 0, imagecolorallocate($mask, 255, 0, 0));
+
+                    // 绘制圆形
+                    imagefilledellipse($mask, $val['width']/2, $val['height']/2, $val['width'], $val['height'], imagecolorallocate($mask, 0, 0, 0));
 
-                    $black = imagecolorallocate($mask, 0, 0, 0);
-                    imagefilledellipse($mask, $val['width']/2, $val['height']/2, $val['width'], $val['height'], $black);
+                    // 设置红色为透明色
+                    imagecolortransparent($mask, imagecolorallocate($mask, 255, 0, 0));
 
-                    // 将原图缩放并裁剪到圆形
+                    // 将原图缩放到圆形大小
                     $sourceResized = imagecreatetruecolor($val['width'], $val['height']);
                     imagecopyresampled($sourceResized, $res, 0, 0, 0, 0, $val['width'], $val['height'], $resWidth, $resHeight);
 
@@ -360,12 +366,13 @@ class UtilService
                     imagecopy($canvas, $sourceResized, 0, 0, 0, 0, $val['width'], $val['height']);
                     imagecopymerge($canvas, $mask, 0, 0, 0, 0, $val['width'], $val['height'], 100);
 
-                    // 将透明背景设置为白色(如果不想要白色背景,可以调整这里的颜色
+                    // 将透明背景设置为白色(可选
                     $white = imagecolorallocate($canvas, 255, 255, 255);
                     for ($x = 0; $x < $val['width']; $x++) {
                         for ($y = 0; $y < $val['height']; $y++) {
-                            $color = imagecolorsforindex($canvas, imagecolorat($canvas, $x, $y));
-                            if ($color['alpha'] == 127) {
+                            $rgba = imagecolorat($canvas, $x, $y);
+                            $alpha = ($rgba >> 24) & 0x7F;
+                            if ($alpha > 100) {
                                 imagesetpixel($canvas, $x, $y, $white);
                             }
                         }
@@ -373,20 +380,23 @@ class UtilService
 
                     imagedestroy($sourceResized);
                     imagedestroy($mask);
+                    imagedestroy($res);
                 } else {
                     // 非圆形,按原逻辑处理
                     $canvas = imagecreatetruecolor($val['width'], $val['height']);
-                    imagefill($canvas, 0, 0, $color);
+                    // 修正这里:使用正确的颜色填充
+                    $bgColor = imagecolorallocate($canvas, 255, 255, 255); // 使用白色背景
+                    imagefill($canvas, 0, 0, $bgColor);
                     imagecopyresampled($canvas, $res, 0, 0, 0, 0, $val['width'], $val['height'], $resWidth, $resHeight);
+                    imagedestroy($res);
                 }
 
                 $val['left'] = $val['left'] < 0 ? $backgroundWidth - abs($val['left']) - $val['width'] : $val['left'];
                 $val['top'] = $val['top'] < 0 ? $backgroundHeight - abs($val['top']) - $val['height'] : $val['top'];
 
-                // 修改合并方式,支持透明度
-                imagecopymerge($imageRes, $canvas, $val['left'], $val['top'], $val['right'], $val['bottom'], $val['width'], $val['height'], $val['opacity']);
+                // 修正:使用正确的imagecopymerge参数
+                imagecopymerge($imageRes, $canvas, $val['left'], $val['top'], 0, 0, $val['width'], $val['height'], $val['opacity']);
 
-                imagedestroy($res);
                 imagedestroy($canvas);
             }
         }
@@ -428,7 +438,6 @@ class UtilService
         }
     }
 
-
     /**
      * TODO 获取小程序二维码是否生成
      * @param $url