【问题标题】:PHP imagejpeg() displays weird charactersPHP imagejpeg() 显示奇怪的字符
【发布时间】:2013-10-29 11:14:37
【问题描述】:

问题:

我找到了这个解释如何使用 imagejpeg() 的简单脚本:

<?php
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5,  'A Simple Text String', $text_color);
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);
?>

当我将它复制/粘贴到一个空的 php 文件中时,它工作得很好。我显示一个图像。

现在,当我将此代码插入我现有的 php 文件之一时,格式如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0   Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<body>

***code above***

</body>
</html>

它不返回任何图像。只是几行奇怪的字符。

我认为会发生什么:

我阅读了其他帖子,我认为问题出在我的主标题“Content-Type”上。但我不明白为什么嵌入代码中的“Content-Type:image/jpeg”不能取代主标题中写的任何内容?它应该告诉 imagejpeg() 显示图像,而不是文本...

有人知道怎么解决吗?谢谢。

【问题讨论】:

    标签: php


    【解决方案1】:

    这是因为它返回 图像数据,就好像您将图像文件作为文本包含在内一样。要在 HTML 中显示图像,有 img 元素:

    <img src="myimage.php" alt="Pretty, isn't it?">
    

    您还应该收到一个警告,指出无法修改标头,因为它们已经发送,这应该提示您您正在做的事情......充其量是奇怪的。

    将返回图像的代码放在一个单独的 PHP 文件中,或者确保在调用时获得 HTML 页面返回 JPEG 图像。将这两者混合并不是一个好主意。

    【讨论】:

    • 非常感谢。实际上我正在使用这种方法,但我认为有一种不同的方法......例如使用 php 函数。
    • ...我不太喜欢建议的方法是,当您想要传递变量时,它会迅速变得不优雅。假设您想指示图像的宽度、质量、路径,您必须通过 GET_ 变量来完成,对吧?所以它看起来像这样: 太重了...如果只调用一个 php 函数会更好。很遗憾做不到...
    • 好吧,您可以使用其他方法,例如将图片引用为/picfolder/500/80/foo.jpg 并使用 404 错误处理程序来创建图像并在它不存在时提供它。几年前,我们使用该方法在浏览器游戏中获取更好的 URL 并自动生成缓存图像。
    【解决方案2】:

    您不能简单地将 PHP 代码嵌入 HTML 文档并发出图像 - 浏览器需要 HTML,而不是图像数据。您从 PHP 脚本发出的内容类型标头实际上并未发送,因为在到达该部分脚本时,标头已经发送。您的新标头将被丢弃,并在您的服务器日志中添加警告。

    为了使这项工作在您的 HTML 文档中包含一个 HTML 图像标签,并使用您的 PHP 脚本作为其src 属性:

    <body>
      <img src="myPHPScript.php">
    </body>
    

    您可以对它应用所需的任何其他样式,就像对任何其他图像一样。

    【讨论】:

      【解决方案3】:

      你也可以这样做。

      <?php
      
          $im = imagecreatetruecolor(120, 20);
          $text_color = imagecolorallocate($im, 233, 14, 91);
          imagestring($im, 1, 5, 5,  'A Simple Text String', $text_color);
      
          ob_start ();
      
          imagejpeg($im);
          imagedestroy($im);
      
          $data = ob_get_contents ();
      
          ob_end_clean ();
      
          $image = "<img src='data:image/jpeg;base64,".base64_encode ($data)."'>";
      ?>
      
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0   Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>Untitled Document</title>
      </head>
      <body>
      
      <?php echo $image; ?> 
      
      </body>
      </html>
      

      为我工作。

      【讨论】:

      • imagejpeg 可能不会以 PNG 格式返回图像数据。对于较大的图像(JPEG 通常为几百 KiB),我会说数据 URI 不是最好的选择。
      • 操作!让我修改一下..谢谢..顺便说一句..我在验证码类上运行了这个..在 png/jpeg 中创造了奇迹..但我总是喜欢 png :)
      【解决方案4】:

      在调用 imagejpeg()

      之前添加这一行
      header('Content-Type: image/jpeg');
      

      这告诉浏览器您显示的是图像而不是 HTML。

      【讨论】:

      • 抱歉,我遇到了同样的问题,但出于另一个原因,所以我认为您遇到了同样的问题,直到我提交答案时我才意识到这一点。
      猜你喜欢
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-01
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多