我已在我的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_charset
为UTF-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
功能imagepng
或imagejpeg
也会出现同样的问题。
我知道如果我将该函数称为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);
}
?>
答案 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;流。
它看起来你的脚本在图像之前发送了一些东西。
我怀疑在三个地方:
<?php
<?php
?>
清理任何不必要的空白
include("website.php");
可能会输出检查包含的文件中的输出
ob_end_flush()
正在释放缓冲区中的任何内容如果要丢弃任何缓冲区,请使用ob_end_clean()