PHP提示报错"图像**,因存在错误无法显示"!

原创 阁主  2020-05-17 21:37:58  阅读 4074 次 评论 0 条
摘要:

最近在使用PHP做一个验证码生成的类库,意外的发现在Windows10系统下开发出现一个BUG,但是亲测在小于PHP7.2的情况下,此BUG不会影响,但是一旦你的PHP版本高于7.0就会造成下文中出现的报错信息.具体解决方案,本文也列出来,供大家一起学习。

简述

先来看下具体的报错信息如下图,估计也只有火狐浏览器才对开发者这么友好的提示了,其他大部分浏览器都是直接一张打着叉叉的图.

火狐报错:

图形报错.png

谷歌报错:

谷歌报错.png

解决思路

1.如果出现上面的报错信息,请检查你的配置环境问题(当然基本上很少出现问题)GD库正常.png

2.字体库文件位置是否正确(正常都是放在项目同目录下),怎么判断?阁主是相同的代码和环境下只有在小于PHP7.2版本才不会出现报错.也就是说本质还是在某个代码段中出现了不兼容的情况,在不修改BUG的情况下,我上传到Linux服务器上,在PHP7.3中也是完美支持的.但是在Windows环境下,只要是大于PHP7.0的环境都会报错,也就是说确实是某个代码段不支持Windows环境.

确实有此文件.png

3.由于上述情况,最后我将可能导致此问题的代码段逐一排查找了出来,最后问题是出在函数imagettftext()新版本的PHP(>7.0)可能存在某种玄学兼容的情况下导致的报错,由于起初我给字体库文件的是相对路径,后面想一下会不会在Windows下需要严格一点,需要指定绝对路径.最后果不其然,确实如此!问题解决.

相对绝对路径.png

解决方案

BUG出现问题:GD库加载字体文件时,需要提供绝对路径.

这里就直接贴解决的代码了,我的解决思路就是把原来赋值的相对路径使用函数realpath()转换为系统的绝对路径,在把绝对路径赋给imagettftext()函数.

//引入字体相对路径
$font_face = './fonts/arialbd.ttf';
//为减少不必要的麻烦,字体路劲一定要使用绝对路径
//GD库加载字体文件时,需求提供绝对路径,路径用realpath()将相对路径转成绝对路径(目前测试PHP>7.0需要使用绝对路径)
$font_face = realpath($font_face);
imagettftext($img, mt_rand(16, 18), mt_rand(-10, 10), 8 + (18 * $i), 24, $font_color, $font_face, $text);

验证码生成正常:

验证码生成正常.png

忠告

1、字体路径问题:为减少不必要的麻烦,请一定要使用绝对路径

2、字体格式:建议使用ttf格式,ttc有可能在linux上不兼容。

3、安装GD库扩展,同时需要freetype扩展,并且是高版本,请安装2.3.11以上版本。

本文地址:https://www.mainblog.cn/228.html
版权声明:本文为原创文章,版权归 阁主 所有,欢迎分享本文,转载请保留出处!
免责申明:有些内容源于网络,没能联系到作者。如侵犯到你的权益请告知,我们会尽快删除相关内容。

评论已关闭!