调用未定义的函数imagerotate()

时间:2011-03-23 14:29:05

标签: php image-processing gd

我想这里有一个奇怪的错误。

  

致命错误:调用未定义的函数imagerotate()   /var/www/web/html/include/php/class/image.class.php   第30行

第30行:

$im = imagerotate( $this->res, $degrees, $bkg );

根据the PHP documentationimagerotate()应该是PHP 4之后的函数,我使用的是PHP 5.

为什么不起作用?其他图片功能,例如imagecreatefromjpeg()imagejpeg()也能正常使用。

来自phpinfo()的GD信息:

GD支持已启用
GD版 2.0或更高
FreeType支持已启用
FreeType链接与freetype
FreeType版本 2.3.7
T1Lib支持启用
GIF阅读支持已启用
GIF创建支持已启用
JPG支持已启用
PNG支持已启用
WBMP支持已启用

3 个答案:

答案 0 :(得分:8)

在您链接到的page中明确说明

  

注意:此功能仅适用   如果PHP是用捆绑编译的   GD库的版本。

其中一个comments

  

这个功能显然包含一个   内存泄漏。因此,它是   远离GD库   与Ubuntu(我假设其他操作系统,   太)。

     

所以,如果你正在运行Ubuntu和   想知道你为什么得到“未定义的呼唤   function imagerotate()“即使   你似乎有正确的GD lib   安装,这就是原因。使用   替代由beau提供   而是dragonflydevelopment dot com。   它完美无缺(适用于角度)   90度的步骤。

     

另一方面,其他一些GD图像   功能(不幸的是,更多   有趣的)遭受同样的痛苦   问题,并保持在Ubuntu之外   分配也是如此。

对于可能的解决方案,请查看here

http://www.php.net/manual/en/function.imagerotate.php#93151复制的代码并修订了

if (!function_exists('imagerotate')) {

    /*
        Imagerotate replacement. ignore_transparent is work for png images
        Also, have some standard functions for 90, 180 and 270 degrees.
        Rotation is clockwise
    */

    function imagerotate_rotateX($x, $y, $theta) {
        return $x * cos($theta) - $y * sin($theta);
    }

    function imagerotate_rotateY($x, $y, $theta) {
        return $x * sin($theta) + $y * cos($theta);
    }

    function imagerotate($srcImg, $angle, $bgcolor = 0, $ignore_transparent = 0) {
        $srcw = imagesx($srcImg);
        $srch = imagesy($srcImg);

        //Normalize angle
        $angle %= 360;
        //Set rotate to clockwise
        $angle = -$angle;

        if ($angle == 0) {
            if ($ignore_transparent == 0) {
                imagesavealpha($srcImg, true);
            }
            return $srcImg;
        }

        // Convert the angle to radians
        $theta = deg2rad($angle);

        //Standart case of rotate
        if ((abs($angle) == 90) || (abs($angle) == 270)) {
            $width = $srch;
            $height = $srcw;
            if (($angle == 90) || ($angle == -270)) {
                $minX = 0;
                $maxX = $width;
                $minY = -$height+1;
                $maxY = 1;
            } else if (($angle == -90) || ($angle == 270)) {
                $minX = -$width+1;
                $maxX = 1;
                $minY = 0;
                $maxY = $height;
            }
        } else if (abs($angle) === 180) {
            $width = $srcw;
            $height = $srch;
            $minX = -$width+1;
            $maxX = 1;
            $minY = -$height+1;
            $maxY = 1;
        } else {
            // Calculate the width of the destination image.
            $temp = array(
                imagerotate_rotateX(0, 0, 0 - $theta),
                imagerotate_rotateX($srcw, 0, 0 - $theta),
                imagerotate_rotateX(0, $srch, 0 - $theta),
                imagerotate_rotateX($srcw, $srch, 0 - $theta)
            );
            $minX = floor(min($temp));
            $maxX = ceil(max($temp));
            $width = $maxX - $minX;

            // Calculate the height of the destination image.
            $temp = array(
                imagerotate_rotateY(0, 0, 0 - $theta),
                imagerotate_rotateY($srcw, 0, 0 - $theta),
                imagerotate_rotateY(0, $srch, 0 - $theta),
                imagerotate_rotateY($srcw, $srch, 0 - $theta)
            );
            $minY = floor(min($temp));
            $maxY = ceil(max($temp));
            $height = $maxY - $minY;
        }

        $destimg = imagecreatetruecolor($width, $height);
        if ($ignore_transparent == 0) {
            imagefill($destimg, 0, 0, imagecolorallocatealpha($destimg, 255,255, 255, 127));
            imagesavealpha($destimg, true);
        }

        // sets all pixels in the new image
        for ($x = $minX; $x < $maxX; $x++) {
            for ($y = $minY; $y < $maxY; $y++) {
                // fetch corresponding pixel from the source image
                $srcX = round(imagerotate_rotateX($x, $y, $theta));
                $srcY = round(imagerotate_rotateY($x, $y, $theta));
                if ($srcX >= 0 && $srcX < $srcw && $srcY >= 0 && $srcY < $srch) {
                    $color = imagecolorat($srcImg, $srcX, $srcY);
                } else {
                    $color = $bgcolor;
                }
                imagesetpixel($destimg, $x-$minX, $y-$minY, $color);
            }
        }

        return $destimg;
    }

}

答案 1 :(得分:2)

你是否有机会运行Ubuntu?然后this可能会解释您收到错误消息的原因。

答案 2 :(得分:1)

首先在脚本中添加if:

if(!extension_loaded('gd'))
             throw new Exception('GD extenstion not installed');

如果正常工作,请通过以下方式查看您的GD信息:

echo '<pre>';
var_dump(gd_info());

并检查是否支持jpeg(它应该在dg_info结果中)。

如果一切正常并且仍然​​无效,请询问您的托管服务。

(错误说你使用的是非现有函数,cna你在使用它的地方设置一些代码吗?)