You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PHP快速合并图片?优化现有Mockup与设计图合并函数

优化PHP设计图与Mockup图合并效率的方案

我正在搭建在线商店,需要将设计图与Mockup图合并,但Mockup数量较多,当前每个设计的合并过程耗时约5分钟,速度过慢,现寻求更高效的PHP函数替代现有实现。

当前使用的PHP函数

function createimageinstantly($img1, $img2, $color, $randF){
  // check the file format
  if(end(explode(".", $img2)) == "png"){$source = imagecreatefrompng($img2);}else{$source = imagecreatefromjpeg($img2);}
  if(end(explode(".", $img1)) == "png"){$destination = imagecreatefrompng($img1);}else{$destination = imagecreatefromjpeg($img1);}
  //to resize the second image start

  list($width, $height) = getimagesize($img2);
  list($width1, $height1) = getimagesize($img1);
  $percent = ((intval($width1 * 100 / $width) * 0.34) / 100);
  // Calculate new sizes
  $newwidth = $width * $percent;
  $newheight = $height * $percent;
  $chupon = imagecreatetruecolor($newwidth, $newheight);
  imagealphablending($chupon, false);
  imagesavealpha($chupon,true);
  $transparent = imagecolorallocatealpha($chupon, 255, 255, 255, 127);
  imagefilledrectangle($chupon, 0, 0, $newwidth, $newheight, $transparent);
  imagecopyresized($chupon, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
  // merge images
  imagecopy($destination, $chupon, (imagesx($destination) / 2) - (imagesx($chupon) / 2), (imagesy($destination) / 2) - (imagesy($chupon) / 2  + imagesy($chupon) / 4), 0, 0, imagesx($chupon), imagesy($chupon));
  //header("Content-type: image/png");
  $file_name = end(explode("/", $img2));
  $file_name = explode(".", $file_name);
  //Output the image
  if(end(explode(".", $img1)) == "png"){imagepng($destination, "../uploades/show/".$file_name[0].$randF."_".$color.".".$file_name[1]);}else{imagejpeg($destination, "../uploades/show/".$file_name[0].$randF."_".$color.".".$file_name[1]);}
}

函数参数说明:$img1为设计图,$img2为Mockup图,$color和$randF用于修改输出图片文件名。合并流程为先调整设计图尺寸,再将其叠加到Mockup图上。

效果与示例图片

合并效果示例

合并效果示例

示例素材

  • Mockup图:
    Mockup示例图
  • 设计图:
    设计示例图

优化建议

  • 替换缩放函数:imagecopyresized 是低质量且低效的缩放方法,改用 imagecopyresampled 可在保证画质的同时提升处理速度,尤其适合大尺寸图片。
  • 减少重复解析:用pathinfo()一次性获取文件扩展名,替代多次explode(".", $imgX)的字符串操作;同时将getimagesize()与图片创建逻辑合并,避免重复读取文件。
  • 及时释放内存:处理完图片后调用imagedestroy()销毁资源,避免内存堆积拖慢批量处理速度。
  • 缓存固定资源:如果Mockup图是固定的,提前计算并缓存其尺寸,无需每次合并都调用getimagesize()。
  • 更换处理扩展:若服务器支持,改用Imagick扩展替代GD库,Imagick的图片处理效率普遍高于原生GD。
  • 批量异步处理:用Redis队列等工具将合并任务转入后台异步执行,前端无需等待;或利用pcntl扩展实现多进程并行处理,提升批量任务的整体速度。

内容的提问来源于stack exchange,提问作者proking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:20:28