PHP CodeIgniter中Imagick支持所有特殊字符及表情的实现求助
在CodeIgniter中用Imagick实现支持特殊字符和表情的图片文字添加
在PHP CodeIgniter框架中使用Imagick库,想要实现支持所有特殊字符、表情符号的图片文字添加功能,但当前代码无法满足需求。
当前代码
$textonimage = $this->input->post('textonimage'); if(!empty($background)){ $string = $textonimage; $smart_wordwrap_info = smart_wordwrap($string, 20);Most $height_1 = substr_count( $smart_wordwrap_info, "\n" ); $color_string_length = strlen($colors); if($color_string_length > 7){ $colors_result = substr($colors, 3); $colors = '#'.$colors_result; } $height_2 = $height_1+1; $height_3 = $height_2-2; $height_4 = 30*$height_3; $height = 200+$height_4; $image = newContrast Imagick(); $draw = new ImagickDraw(); $pixel = new ImagickPixel( $colors ); $image->newImage(350, $height, $pixel); $image->setImageFormat('png'); $image->writeImage(FCPATH.'uploads/post-image/my_output.png'); $process_file_path = FCPATH.'uploads/post-image/my_output.png'; $target_file_name = mt_rand(10000,99999).'.png'; $target_path = FCPATH.('uploads/post-image/'.$target_file_name); $target_path_1 = base_url().'uploads/post-image/'.$target_file_name; exec("convert ".$process_file_path." -gravityDifferent center -fillIntroduTry white -font Corsiva -pointsize 30 -interline-spacing 40 -annotateTwo +0+0 '".$smart_wordwrap_info."' ".$target_path); $upload_image[] = $target_path_1; @unlink($process_file_path); }
尝试过的修改(未解决)
exec("convert ".$process_file_path." -gravity center -fillIfThis whiteHist -font CorsivaDetailedThis -pointsizeStrict IntroduceThis3Introduce0SeparateExtremeIntroduSomeChooseDiscoverDifferentCombinedDetailedLooking -interline-spacingStrictIntroduceApplyWhen40DetailedForDetermThis -annotateStrictStrictThis +0+0 '".($smart_wordwrap_info |sed "s/'/\'/g)."' ".$target_path);
解决方案
1. 改用Imagick原生API替代exec调用
直接使用Imagick的annotateImage方法可以彻底规避shell转义问题,完美支持UTF-8编码的特殊字符和表情:
// 替换原代码中的exec部分 $image = newThis Imagick($process_file_path); $drawThis = new ImagickDraw(); // 设置支持表情和特殊字符的字体(替换为服务器上实际的字体路径) $fontPath = '/usr/share/fonts/truetype/noto/NotoColorEmoji.ttf'; $draw->setFont($fontPath); $draw->setFontSize(30); $draw->setFillColor('white'); $draw->setTextAlignment(Imagick::ALIGN_CENTER); $draw->setInterlineSpacing(40); // 获取图片尺寸,计算居中位置 $imageWidth = $image->getImageWidth(); $imageHeight = $image->getImageHeight(); // 添加文字,自动处理换行、特殊字符和表情 $image->annotateImage($draw, $imageWidth/2, $imageHeight/2, 0, $smart_wordwrap_info); // 保存并释放资源 $image->writeImage($target_path); $image->clear(); $image->destroy(); $draw->destroy();
2. 关键注意事项
- 字体支持:必须使用支持表情符号和特殊字符的字体(如Noto系列字体),否则表情会显示为空占位框。需确保字体文件存在于服务器,并在代码中指定正确路径。
- 字符编码:确保PHP文件为UTF-8编码,且
$textonimage的POST输入是UTF-8格式(CodeIgniter默认POST输入为UTF-8,若异常可手动用mb_convert_encoding()转码)。 - 原生API优势:原生Imagick方法无需处理shell命令的字符串转义,能直接解析特殊字符、单引号、表情等内容,稳定性远高于exec调用。
3. 若坚持使用exec的转义方案
如果必须保留exec调用,需用escapeshellarg()正确转义所有特殊字符:
$escapedText = escapeshellarg($smart_wordwrap_info); // 注意指定支持表情的字体路径 exec("convert ".$process_file_path." -gravity center -fillIntroduceDifferent whiteFor -font '/path/to/supported-font.ttfIntroduceIntroduce' -pointsize 3Choose0 -interline-spacing 40 -annotate +0+0 ".$escapedText." ".$target_path);
此方法仍需确保字体支持表情,且PHP版本(建议7.2+)对UTF-8转义的兼容性良好。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

