使用GD输出黑色图像调整大小

2022-08-30 18:38:06

什么会导致php gd在调整大小后产生黑色图像?以下代码始终为每个有效的 jpeg 文件输出一个黑色图像。

<?php

$filename = 'test.jpg';
$percent = 0.5;

header('Content-Type: image/jpeg');

list($width, $height) = getimagesize($filename);
$newwidth = $width * $percent;
$newheight = $height * $percent;

$thumb = imagecreatetruecolor($newwidth, $newheight);
$source = imagecreatefromjpeg($filename);

imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

imagejpeg($thumb);
imagedestroy($thumb);
?>

输出 :gd_info()

  Array
(
    [GD Version] => bundled (2.1.0 compatible)
    [FreeType Support] => 1
    [FreeType Linkage] => with freetype
    [T1Lib Support] => 
    [GIF Read Support] => 1
    [GIF Create Support] => 1
    [JPEG Support] => 1
    [PNG Support] => 1
    [WBMP Support] => 1
    [XPM Support] => 
    [XBM Support] => 1
    [JIS-mapped Japanese Font Support] => 
)

该代码似乎在其他环境中工作。可能与操作系统,已安装的软件包,库等有关?


答案 1
研究

只是试图重现你的情况。使用开箱即用的 PHP 和 Apache 运行代码会显示以下内容

无法显示图像 “”,因为它包含错误。http://localhost/

尽管浏览器告诉您存在一些错误,但由于响应中返回的标头因此无法看到它们,从而迫使浏览器将其解释为图像。通过删除并设置以下内容将输出错误。Content-Type: image/jpegheader

ini_set('error_reporting', E_ALL);
ini_set('display_errors', true);
...
//header('Content-Type: image/jpeg');
...

什么会导致php gd在调整大小后产生黑色图像?

由于输出证明GD扩展名已加载,请检查文件名(linux是区分大小写的)和权限是否正确。如果 正在运行为(组)gd_infoApachewww-data

sudo chown :www-data test.jpg && sudo chmod 660 test.jpg 
代码改进/解决方案注释
ini_set('error_reporting', E_ALL);
ini_set('display_errors', true);

if (extension_loaded('gd') && function_exists('gd_info'))
{
    $filename = 'test.jpg';

    if (file_exists($filename) && is_readable($filename))
    {
        $percent = 0.5;

        header('Content-Type: image/jpeg');

        list($width, $height) = getimagesize($filename);
        $newwidth = $width * $percent;
        $newheight = $height * $percent;

        $thumb = imagecreatetruecolor($newwidth, $newheight);
        $source = imagecreatefromjpeg($filename);

        imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);

        imagejpeg($thumb);
        imagedestroy($thumb);
    }
    else
    {
        trigger_error('File or permission problems');
    }
}
else
{
    trigger_error('GD extension not loaded');
}

这应该用作临时解决方案(开发环境)。恕我直言,错误应该由中央错误处理程序处理,应该在生产中。此外,默认情况下会记录错误(在这种情况下会有)- 检查日志中是否有更多(频繁越好)。此外,在 linux(带有 )上,单行代码将在您的系统上安装 GD:display_errorsfalseFatal errorapt

sudo apt-get update && sudo apt-get install php5-gd && sudo /etc/init.d/apache2 restart

答案 2

确保 gd 已安装并启用。

要进行检查,请使用以下命令创建一个 PHP 文件:

<?php phpinfo(); 

通过浏览器访问文件,然后向下滚动到 gd 部分。如果 gd 不存在,或者它被禁用,请使用 yum、apt-get 或 Windows 等效项添加它。

您还需要可用的GD库(http://www.libgd.org/)。

考虑切换到 IMagick (http://php.net/manual/en/book.imagick.php) 以获得更好的图像质量。


推荐