PHP:从动态文本生成png

PHP:从动态文本生成png,php,png,gd,Php,Png,Gd,我编写此函数是为了从文本创建png文件: function pngfromtext($text){ $fontsize = 5; $width = imagefontwidth($fontsize)* strlen($text); $height = imagefontheight($fontsize); $img = imagecreate($width, $height); // Transparent background $black

我编写此函数是为了从文本创建png文件:

function pngfromtext($text){
    $fontsize = 5;
    $width = imagefontwidth($fontsize)* strlen($text);
    $height = imagefontheight($fontsize);

    $img = imagecreate($width, $height);

    // Transparent background
    $black = imagecolorallocate($img, 0, 0, 0);
    imagecolortransparent($img, $black);

    // Red text
    $red = imagecolorallocate($img, 255, 255, 255);
    imagestring($img, $fontsize, 0, 0, $text, $red);

    header('Content-type: image/png');
    imagepng($img);
    imagedestroy($img);
}
我将代码放在
functions.php
文件中,当在另一个页面中使用此函数时,我得到以下错误:

 Warning: Cannot modify header information - headers already sent by (output started at ..\functions.php on line 58
�PNG  IHDRZ^%JPLTE����ٟ�tRNS@��f�IDAT�c` Hȱ�7�H��'��`c��s�����i��$���Hl`8��Ɛ�� ��#�c��p�� q�3f�òm�� �g�ـ�6fF ���h�bc�sXd4c�A4����?|�¦����r+���!IEND�B`�

怎么了?

将标题设置在您知道输出将是图像的位置。这意味着设置此语句

header('Content-type: image/png');
在php脚本的开头


还有一种可能是header命令在此点之前已经执行。

将header设置在您知道输出将是图像的位置。这意味着设置此语句

header('Content-type: image/png');
在php脚本的开头

还有一种可能性是,在此点之前已经执行了header命令。

header('Content-type:image/png')之前放置
ob_clean()
这将清理响应对象,以便您可以在
标题('Content-type:image/png')之前再次添加标题放置
ob_clean()


这将清理响应对象,以便您可以再次添加标题。

您不能在页面上使用多个标题。

您不能在页面上使用多个标题。

在设置标题之前,请确保您没有输出任何内容(echo/var_dump等)。您可能在
标记之外的某个地方有空格,或者可能在某处生成了警告/通知。在functions.php的第58行显示代码,如果没有帮助,请观察中的请求/响应,查看在PNG头之前发送了哪些特定输出。@没有任何输出output@DCoder删除了所有空格,但没有机会。第58行是什么?您是否使用Fiddler查看了请求?请确保在设置标题之前没有输出任何内容(echo/var_dump等)。您可能在
标记之外的某个位置有空格,或者可能在某个位置生成了警告/通知。在functions.php的第58行显示代码,如果没有帮助,请观察中的请求/响应,查看在PNG头之前发送了哪些特定输出。@没有任何输出output@DCoder删除了所有空格,但没有机会。第58行是什么?你看了Fiddler的请求了吗?这是一个函数,我不能在脚本顶部使用header。这是一个函数,我不能在脚本顶部使用header可能是一个非常肮脏的解决方案,因为我们不知道在他的函数之前会出现什么。也可能有一个框架可以设置一些复杂的标题…我知道,但是如果它使用一个框架,它真的很难修复,所以这是一种快速而肮脏的方式,是的,这取决于框架。这个答案的问题在于它只修复了症状,而不是代码中的bug。这可能是一个非常糟糕的解决方案,因为我们不知道在他的功能之前会出现什么。也可能有一个框架可以设置一些复杂的标题…我知道,但是如果它使用一个框架,它真的很难修复,所以这是一种快速而肮脏的方式,是的,这取决于框架。这个答案的问题在于它只修复了症状,而不是代码中的bug。