PHP怎么实现图片合并
本篇内容介绍了“PHP怎么实现图片合并”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
准备工作
需要海报的底图
小程序码的图片
代码部分结合YII2但不影响使用
完整过程
生成小程序码图片
缩放小程序码的图片大小 (如果尺寸符合海报大小可省略) 280-1280px
将缩放后的小程序图片合成到背景图片
合成文字信息
生成小程序码图片 (我使用的场景是无限制小程序码code地址 三种自行选择)
//微信小程序 小程序码 public static function getWeChatSmallProgramCode($scene) { $AccessToken = self::getAccessToken(); $url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" . $AccessToken; $postData = [ 'scene' => $scene, 'page' => 'pages/index/index', 'width'=>930 ]; $postData = json_encode($postData); $contentData = self::sendPost($url, $postData); return $contentData; //如果图片大小符合这开启base64位图片地址也可以完成图片的合并合文字的合并// return self::base64UrlCode($contentData, 'image/png'); } protected static function sendPost($url, $post_data) { $options = array( 'http' => array( 'method' => 'POST', 'header' => 'Content-type:application/json', //header 需要设置为 JSON 'content' => $post_data, 'timeout' => 60 //超时时间 ) ); $context = stream_context_create($options); return file_get_contents($url, false, $context); } //二进制转图片image/png public static function base64UrlCode($contents, $mime) { $base64 = base64_encode($contents); return ('data:' . $mime . ';base64,' . $base64); }
缩放小程序码的图片大小
public static function picZoom($img_path,$new_width,$new_height,$new_img_path) { //获取尺寸 list($width, $height, $img_type, $attr) = getimagesize($img_path); $imageinfo = [ 'width' => $width, 'height' => $height, 'type' => image_type_to_extension($img_type, false), 'attr' => $attr ]; $fun = "imagecreatefrom" . $imageinfo['type']; $image = $fun($img_path); //创建新的幕布 $image_thump = imagecreatetruecolor($new_width, $new_height); //复制源文件 imagecopyresampled($image_thump, $image, 0, 0, 0, 0, $new_width, $new_height, $imageinfo['width'], $imageinfo['height']); imagedestroy($image); $image = $image_thump; $func = 'image' . $imageinfo['type']; $func($image, $new_img_path); }
将缩放后的小程序图片合成到背景图片
public static function picMerge($dstPath, $class="lazy" data-srcPath, $dstX = 0, $dstY = 0, $class="lazy" data-srcX = 0, $class="lazy" data-srcY = 0, $pct = 100, $filename = '') { //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dstPath)); $class="lazy" data-src = imagecreatefromstring(file_get_contents($class="lazy" data-srcPath)); //获取水印图片的宽高 list($class="lazy" data-src_w, $class="lazy" data-src_h) = getimagesize($class="lazy" data-srcPath); //将水印图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果// imagecopymerge($dst, $class="lazy" data-src, 80, 125, 0, 0, $class="lazy" data-src_w, $class="lazy" data-src_h, 100); imagecopymerge($dst, $class="lazy" data-src, $dstX, $dstY, $class="lazy" data-srcX, $class="lazy" data-srcY, $class="lazy" data-src_w, $class="lazy" data-src_h, $pct); //如果水印图片本身带透明色,则使用imagecopy方法 //imagecopy($dst, $class="lazy" data-src, 10, 10, 0, 0, $class="lazy" data-src_w, $class="lazy" data-src_h); //输出图片 list($dst_w, $dst_h, $dst_type) = getimagesize($dstPath); switch ($dst_type) { case 1://GIF if (!$filename) { header('Content-Type: image/gif'); imagegif($dst); } else { imagegif($dst, $filename); } break; case 2://JPG if (!$filename) { header('Content-Type: image/jpeg'); imagejpeg($dst); } else { imagejpeg($dst, $filename); } break; case 3://PNG if (!$filename) { header('Content-Type: image/png'); imagepng($dst); } else { imagepng($dst, $filename); } break; default: break; } imagedestroy($dst); imagedestroy($class="lazy" data-src); }
合成文字信息
public static function addFontToPic($dstPath, $fontPath, $fontSize, $text, $dstY, $filename = '') { ob_end_clean(); //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dstPath)); //打上文字 $fontColor = imagecolorallocate($dst, 255, 255, 255);//字体颜色 $width = imagesx($dst); $height = imagesy($dst); $fontBox = imagettfbbox($fontSize, 0, $fontPath, $text);//文字水平居中实质 imagettftext($dst, $fontSize, 0, ceil(($width - $fontBox[2]) / 2), $dstY, $fontColor, $fontPath, $text); //输出图片 list($dst_w, $dst_h, $dst_type) = getimagesize($dstPath); switch ($dst_type) { case 1://GIF if (!$filename) { header('Content-Type: image/gif'); imagegif($dst); } else { imagegif($dst, $filename); } break; case 2://JPG if (!$filename) { header('Content-Type: image/jpeg'); imagejpeg($dst); } else { imagejpeg($dst, $filename); } break; case 3://PNG if (!$filename) { header('Content-Type: image/png'); imagepng($dst); } else { imagepng($dst, $filename); } break; default: break; } imagedestroy($dst); return $filename; }
外部的调用
public static function generateWeChatAppletImage($shop_id, $shop_name) { //1 生成小程序码 //2 合成小程序码到背景图片 $sceneStr = '?shop_id=' . $shop_id; $weChatAppImgBaseData = WxTools::getWeChatSmallProgramCode($sceneStr); $weChatAppImgPath = './weChatAppImg/shop_code_' . $shop_id . '.jpg'; file_put_contents($weChatAppImgPath, $weChatAppImgBaseData); //合并到背景图片中 $beiJinImgPath = './weChatAppImg/weChatBJ.jpg'; $mergeImgFile = './weChatAppImg/shop_mini_program' . $shop_id . '.jpg'; GenerateCodeImg::picMerge($beiJinImgPath, $weChatAppImgPath, 408, 714, $class="lazy" data-srcX = 0, $class="lazy" data-srcY = 0, $pct = 100, $mergeImgFile); //3 合成文字 $fontPath = './plus/fonts/SourceHanSansCN-Bold.ttf'; $fontSize = 40; $dstY = 640; GenerateCodeImg::addFontToPic($mergeImgFile, $fontPath, $fontSize, $shop_name, $dstY, $mergeImgFile); $weChatCodeImgUrL = \Yii::$app->request->hostInfo . '/weChatAppImg/shop_code_' . $shop_id . '.jpg'; $weChatAppImgUrl = \Yii::$app->request->hostInfo . '/weChatAppImg/shop_mini_program' . $shop_id . '.jpg'; return [ 'weChatCodeImgUrL' => $weChatCodeImgUrL, 'weChatAppImgUrl' => $weChatAppImgUrl, ]; }
常见的问题
1文字合并的时候出现乱码?
第一检测一下字体是否是正常tff字体 如果不知道去C://windows/Fonts 随便找一个 微软雅黑都行
英文阿拉布数字正常 中文乱码
$text = mb_convert_encoding("呵呵呵","UTF-8","GBK");
$text = mb_convert_encoding("呵呵呵","html-entities","UTF-8");
设置看看
“PHP怎么实现图片合并”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341