PHP使用GD2库生成的图像无法输出的解决方法

前言

有时候我们可能随意的使用PHP跟GD库来创建一张图片,可能是用于展示验证码之类的。
官方代码如下:

Note: 此函数需要 GD 2.0.1 或更高版本(推荐 2.0.28 及更高版本)。
<?php
header ('Content-Type: image/png');
$im = @imagecreatetruecolor(120, 20)
      or die('Cannot Initialize new GD image stream');
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5,  'A Simple Text String', $text_color);
imagepng($im);
imagedestroy($im);
?>

以上例程的输出类似于:
示例图片

可能会遇到的坑

事情总是往往不如人意,在大大小小的项目,零零碎碎的代码中,总会遇到一些问题,造成用GD2库画图,图像无法显示等等。

bug1:未开启GD模块

找到你PHP的配置文件:php.ini,寻到这里行

;extension=php_gd2.dll

如果这行前面有分号,记得去掉,并重启相关服务。

bug2:执行文件格式有问题

你的代码很可能是使用了像editpuls或者notepad++这样的文本编辑器编辑的,那么他们的默认编码格式就是有BOM的utf-8。

UTF-8 BOM又叫UTF-8 签名,其实UTF-8的BOM对UFT-8没有作用,是为了支持UTF-16,UTF-32才加上的BOM,BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行。一般我用UTF-8无BOM格式,所以你需要将代码的编码格式改成无BOM格式。

如何检验代码编码格式是否有带BOM呢?有一个简单的方法:

$url = 'http://xxx/xxx'
$s = file_get_contents($url);
echo bin2hex($s);
//输出结果:efbbbf89504e470d0a1a0a0000000d49484452000000c6000000c60103000000b3556d1e0000000......

如果结果前面是efbbbf开头,就说明代码带有BOM 头。

这时就采用各种编辑器或者小工具,转换一下代码编码为不带BOM的就可以了。

bug3:受缓存影响

如果尝试多种方法无果,这时可以考虑使用ob_clean()了,清除一下缓存。
ob_clean这个函数的作用就是用来丢弃输出缓冲区中的内容,如果你的有许多生成的图片类文件,那么想要访问正确,就要经常清除缓冲区。例如:

public function create()
{
    ob_clean();
    $a = new verify();
    session::set('captcha', strtolower($a->create(4, 15)));
    view::assign("captcha", $a);
    view::display("captcha");
    exit(0);
}

希望以上能帮助大家填些坑~

posted @ 2019-02-22 22:00:00 kuye 阅读(9482) 评论(1)
发表评论
昵称
邮箱
网址

  1. #1楼 2019-02-28 10:03 小王先森 Windows 7 Chrome 71.0.3578.98 中国 江苏省 苏州市 电信


    来了 :mad: