前端时间用了一个PHP的处理PDF的类叫MPDF,非常的好用(除了字体处理比较麻烦以外其他都还好)
最近接了个需求是需要通过PHP生成海报图片,需要在海报上写入文字、图片、二维码等内容,还有个透明图虚拟印章的处理,下面分享一下用到的代码:
逻辑如下: 先准备底图、生成二维码类、印章图(PNG透明格式),然后代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
$bg_path = WB_THEME_DIR . '/assets/core/bg.png'; //背景图片 $bg_img = imagecreatefromstring(file_get_contents($bg_path)); //整合文章图片 $thumbnail_id = get_post_thumbnail_id($post_id); $image_info = wp_get_attachment_image_src($thumbnail_id); $img_path = $image_info[0]; //获取文章图片数据 $img = imagecreatefromstring(file_get_contents($img_path)); list($img_width, $img_height, $img_type) = getimagesize($img_path); //写入文章图片到背景图片 imagecopyresampled($bg_img, $img, 310 + absint(450 - $img_width / 2), 435 + absint(450 - $img_height / 2), 0, 0, $img_width, $img_height, $img_width, $img_height); //销毁文章图片 imagedestroy($img); //整合二维码 $path = wp_upload_dir('qr'); //获取目录 $qrcode_path = $path['path'] . DIRECTORY_SEPARATOR . 'qr-' . $post_id . '.png'; //这里用到了Qrcode类来生成二维码 QRcode::png(get_the_permalink($post_id), $qrcode_path, 0, 8, 1); $qr_img = imagecreatefromstring(file_get_contents($qrcode_path)); list($qr_width, $qr_height, $qr_type) = getimagesize($qrcode_path); //组合二维码 imagecopymerge($bg_img, $qr_img, 400, 1380, 0, 0, $qr_width, $qr_height, 100); //销毁二维码 imagedestroy($qr_img); //写字部分 $font_st = WB_THEME_DIR . '/assets/core/fonts/st.ttf'; //字体文件 $black = imagecolorallocate($bg_img, 0, 0, 0);//字体颜色 RGB $text = get_the_title($post_id); imagefttext($bg_img, 36, 0, 660, 1510, $black, $font_st, $text); //透明图片要做到最后放到文字上面 $yz_path = WB_THEME_DIR . '/assets/core/yz.png'; //图片PNG $yz_img = imagecreatefromstring(file_get_contents($yz_path)); imagesavealpha($yz_img, true); list($yz_width, $yz_height, $yz_type) = getimagesize($yz_path); //imagecopyresampled是支持透明PNG图片的如果用imagecopymerge遇到png会变黑底 imagecopyresampled($bg_img, $yz_img, 1600, 800, 0, 0, $yz_width, $yz_height, $yz_width, $yz_height); imagedestroy($yz_img); //输出或者保存文件 //header("Content-Type: application/force-download"); //header("Content-Disposition: attachment; filename=zs-{$post_id}.png"); header('Content-Type: image/png'); imagepng($bg_img); imagedestroy($bg_img); |
imagecopyresampled是支持透明PNG图片的如果用imagecopymerge遇到png会变黑底
注意叠加图片的大小尺寸和位置