Вызов неопределенной функции imagerotate () - PullRequest
4 голосов
/ 23 марта 2011

У меня здесь странная ошибка, я думаю.

Неустранимая ошибка: вызов неопределенной функции imagerotate () в /var/www/web/html/include/php/class/image.class.php по линии 30

ЛИНИЯ 30:

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

Согласно документации PHP , imagerotate() должна быть функцией начиная с PHP 4, и я использую PHP 5.

Почему это не работает? Другие функции изображения, такие как imagecreatefromjpeg() и imagejpeg(), работают нормально.

Информация GD от phpinfo ():

Поддержка GD включена
Версия GD 2.0 или выше
Поддержка FreeType включена
FreeType Linkage со свободным типом
Версия FreeType 2.3.7
Поддержка T1Lib включена
Поддержка чтения GIF включена
Поддержка GIF Create включена
Поддержка JPG включена
Поддержка PNG включена
Поддержка WBMP включена

Ответы [ 3 ]

8 голосов
/ 23 марта 2011

На странице , на которую вы ссылаетесь, четко написано

Примечание. Эта функция доступна только в том случае, если PHP скомпилирован с комплектной версией библиотеки GD.

И один из комментариев скажем

Эта функция, очевидно, содержит утечку памяти.Из-за этого она не попала в библиотеку GD, которая поставляется с Ubuntu (и я предполагаю, что и другие ОС тоже.)function imagerotate () ", хотя у вас, похоже, установлена ​​правильная библиотека GD, вот почему.Вместо этого используйте альтернативу, предоставленную beau в dragonflydevelopment dot com.Он работает безупречно (для углов с шагом 90 градусов).

В дополнение к этому, некоторые другие функции изображения GD (к сожалению, более интересные) страдают от той же проблемы и находятся вне Ubuntu.также:

Возможное решение смотрите здесь

Код скопирован с 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;
    }

}
2 голосов
/ 23 марта 2011

Ты случайно запускаешь Ubuntu?Тогда это может объяснить, почему вы получаете сообщение об ошибке.

1 голос
/ 23 марта 2011

Сначала добавьте в ваш скрипт if:

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

Если он работает, проверьте информацию GD по:

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

А также убедитесь, что jpeg поддерживается (это должно бытьв результатах dg_info).

Если все в порядке и все еще не работает, обратитесь в службу хостинга.

(Ошибка говорит о том, что вы используете несуществующую функцию, возможно, вы вставили код, гдеВы используете это?)

...