创建的图像不会显示在浏览器中

时间:2017-11-15 14:31:08

标签: php gd content-type

我已在我的PHP Version 5.6.32服务器上安装了GD。

GD Support  enabled
GD headers Version  2.2.4
GD library Version  2.2.4
FreeType Support    enabled
FreeType Linkage    with freetype
FreeType Version    2.8.0
GIF Read Support    enabled
GIF Create Support  enabled
JPEG Support    enabled
libJPEG Version unknown
PNG Support enabled
libPNG Version  1.6.29
WBMP Support    enabled
XPM Support enabled
libXpm Version  30411
XBM Support enabled

以下是创建图像的功能:

  // Print a bar image
  static function printBarImage($color, $width, $height) {
    // Create a blank image
    $image = imagecreatetruecolor($width, $height);

    if (strlen($color) == 6) {
      $color = "#" . $color;
    }

    $r = intval(substr($color, 1, 2), 16);
    $g = intval(substr($color, 3, 2), 16);
    $b = intval(substr($color, 5, 2), 16);
    $color = imagecolorallocate($image, $r, $g, $b);

    // Fill up the image background
    imagefilledrectangle($image, 0, 0, $width, $height, $color);

    // Header indicating the image type
    header("Content-type:image/jpeg"); // <<== This is the line 467

    // Create the image in the best jpeg quality
    imagejpeg($image, NULL, 100);

    // Destroy the image
    imagedestroy($image);
  }

以上函数由脚本调用:

<?PHP

require_once("website.php");

ob_end_flush(); // <<== Added for debugging purposes

$color = LibEnv::getEnvHttpGET("color");
$width = LibEnv::getEnvHttpGET("width");
$height = LibEnv::getEnvHttpGET("height");

$color = urldecode($color);

if ($color && $width > 0 && $height> 0) {
  LibImage::printBarImage($color, $width, $height);
}

?>

但它不会显示任何图像。

您可以在http://www.thalasoft.com/engine/system/utils/printBarImage.php?color=%2392299FF&width=30&height=100

看到它的实际效果

我的phpinfo页面显示default_charsetUTF-8

但文件在charset中:

$ uchardet system/utils/printBarImage.php 
ascii/unknown

该文件不包含BOM字符:

$ head -c 3 system/utils/printBarImage.php | hexdump -C
00000000  3c 3f 50                                          |<?P|
00000003

功能imagepngimagejpeg也会出现同样的问题。

我知道如果我将该函数称为imagepng($image, "/usr/bin/learnintouch/engine/image.jpeg");,则会创建该图像,然后在文件系统上创建/usr/bin/learnintouch/engine/image.jpeg文件,我可以在另一个浏览器选项卡中打开它并查看图像。< / p>

即使保存图像,以后也无法读取,也不会显示图像:

//imagejpeg($image, "/usr/bin/learnintouch/engine/image.jpeg", 100);
readfile("/usr/bin/learnintouch/engine/image.jpeg");

根据Phil的建议,我添加了一个ob_end_flush();调用,它在我的开发环境中给出了以下错误(在源代码中也标出了行号):

Error message: Cannot modify header information - headers already sent by (output started at /usr/bin/learnintouch/engine/system/utils/printBarImage.php:5)
Filename: /usr/bin/learnintouch/engine/lib/image.php
Line: 467

http://www.thalasoft.com/engine/system/utils/printBarImage.php?color=%2392299FF&width=30&height=100的公共测试环境中,它会显示乱码。

更新:评论解决方案......我将ob_end_clean();函数调用添加到脚本文件中,然后显示图像。脚本文件现在显示为:

<?PHP

require_once("website.php");

// Prevent any possible previous header from being sent before the following image header that must be the first
ob_end_clean();

$color = LibEnv::getEnvHttpGET("color");
$width = LibEnv::getEnvHttpGET("width");
$height = LibEnv::getEnvHttpGET("height");

$color = urldecode($color);

if ($color && $width > 0 && $height> 0) {
  LibImage::printBarImage($color, $width, $height);
}

?>

2 个答案:

答案 0 :(得分:1)

在这里采取一些自由,但这是我正在发生的事情。

鉴于printBarImage函数为static,我猜它是一个类的一部分。我也猜测这个类在它自己的文件中,它看起来像这样

<?php
// ImageUtils.php
class ImageUtils {
    static function printBarImage($color, $width, $height) {
        // ...
    }
}
?>

我想你的printBarImage.php PHP文件看起来像

<?php
require_once 'ImageUtils.php';
ImageUtils::printBarImage($_GET['color'], $_GET['width'], $_GET['height']);

问题很可能是您的类.php文件有一些尾随空格。

具体(使用空白注释)

?>$
$

因此,您的printBarImage.php脚本会在二进制图像数据之前的顶部输出换行符。

解决方案是在.php个文件的末尾omit the final closing PHP tag

我也猜测你的PHP环境启用了输出缓冲。我不推荐这个。如果你到disable it,你可能会看到像

这样的东西
  

警告:无法修改标题信息 - 已经在ImageUtils.php上的#Un.s.pp上发送的标题(在ImageUtils.php:&lt; last line&gt;处开始输出)header(...)&gt;

即使我对空白字符的位置有误,您仍应尝试禁用输出缓冲以帮助查明问题。

答案 1 :(得分:0)

下载&#34;图像&#34>流,看起来你的&#34;图像前面有一个额外的数据&#34;流。

它看起来你的脚本在图像之前发送了一些东西。

我怀疑在三个地方:

1。你可能在<?php

前面有额外的空格

<?php ?> 清理任何不必要的空白

2。您的include("website.php");可能会输出

检查包含的文件中的输出

3。 ob_end_flush()正在释放缓冲区中的任何内容

如果要丢弃任何缓冲区,请使用ob_end_clean()