Класс для загрузки и изменение размера изображений "на лету" выполняется медленно на больших изображений


Я сделал этот класс PHP, который загружает все изображения можно указать и изменяет его размер до любого размера вы хотите.

Особенности

Если указанный размер больше, чем оригинал, она не будет растягиваться, а не изображение, но использовать отступы. Или если размер, который вы просили не оригинальные пропорции, оно не искажает изображение, но использовать отступы, чтобы соответствовать требуемым размером.

Вы можете указать, какой цвет вы хотите, чтобы обивка должна быть, по умолчанию-белый. Она сохраняет прозрачность .PNG-файлы. Вы можете указать, какой результат вы хотите использовать (.формате JPEG/.гиф/.ПНГ), но по умолчанию используется исходный тип файла.

Основная Цель

Главная причина, почему я хотел сделать этот класс был, так что я могу загрузить 1 большой файл и использовать его по всему сайту. Так что я бы не нужно создавать несколько копий одного и того же изображения разных размеров (большие, эскиз и т. д.)

В теории я хотел быть в состоянии загрузить большой вариант изображения у меня, тогда еще быть в состоянии загрузить страницу с 50 небольших миниатюр относительно быстро, потому что большие картинки будут уменьшены до их загрузки.

Проблема

Он работает, но при загрузке большого изображения в виде миниатюр, оно до сих пор кажется, займет примерно столько же времени, как если бы не было усадки. Только вместо того, чтобы ждать его, чтобы загрузить вас ждут изображения должны быть обработаны и пересчитаны, прежде чем вы можете начать загрузку. Эта задержка происходит только при обработке больших изображений. Я был 5МБ.

Код

class ImageSrv
{
    private $image;
    private $original_width;
    private $original_height;
    private $original_type;

    // default colors for background and padding
    private $r = 255;
    private $g = 255;
    private $b = 255;

    function load($image_file) 
    {
        $this->image = $this->createImageFromFile($image_file);
    }

    function setBackground($r, $g, $b)
    {
        $this->r = (int) $r;
        $this->g = (int) $g;
        $this->b = (int) $b;
    }

    function createImageFromFile($image_file)
    {
        $image_info = getimagesize($image_file);

        $this->original_width = $image_info[0];
        $this->original_height = $image_info[1];
        $this->original_type = $image_info[2];

        if( $this->original_type == IMAGETYPE_JPEG ) 
        {
            return imagecreatefromjpeg($image_file);
        } 
        else if( $this->original_type == IMAGETYPE_GIF ) 
        {
            return imagecreatefromgif($image_file);
        } 
        else if( $this->original_type == IMAGETYPE_PNG ) 
        {
            /*
             * create image and preserve transpancy
             * this keeps png files from having a black backgroung
             * when you don't resize them.
             * pngs converted to jpgs still have a black background
             * not sure how to make it a different color
             */
            $im = imagecreatefrompng($image_file);
            imagealphablending($im, false);
            imagesavealpha($im, true);

            return $im;
        }   
    }

    function setSize($width = NULL,$height = NULL) 
    {
        if($width == NULL && $height == NULL)
        {
            return; 
        }

        $ratio = $this->original_width / $this->original_height;
        $new_ratio = $width / $height;

        if($width == NULL)
        {
            $width = $height*$ratio;
            if($width > $this->original_width)
            {
                $width = $this->original_width; 
            }
        }
        else if($height == NULL)
        {
            $height = $width/$ratio;
            if($height > $this->original_height)
            {
                $height = $this->original_height;   
            }
        }


        // if width is greater than original width 
        // set to original width and pad the difference
        if($width < $this->original_width)
        {
            $w = $width;
        }
        else
        {
            $w = $this->original_width;
        }
        // if height is greater than original height 
        // set to original height and pad the difference
        if($height < $this->original_height)
        {
            $h = $height;
        }
        else
        {
            $h = $this->original_height;
        }
        // check if new deminsions are same aspect ratio
        // if not, fix aspect ratio and pad the difference
        if( $w / $h != $ratio )
        {
            if($width > $w && $height > $h)
            {
                //no scaling    
            }
            else if($width > $w)
            {
                $w = $h*$ratio;
            }
            else if($height > $h)
            {
                $h = $w/$ratio;
            }
            else if($ratio < $new_ratio)
            {
                $w = $h*$ratio;
            }
            else
            {
                $h = $w/$ratio;
            }
        }

        // resize image with correct aspect ratio and use padding to meet required size
        $image = imagecreatetruecolor($width, $height);
        imagealphablending($image, false);
        imagesavealpha($image, true);
        $transparent = imagecolorallocatealpha($image, $this->r, $this->g, $this->b, 127);
        imagefill($image, 0, 0, $transparent);
        imagecopyresampled($image, $this->image, ($width - $w) / 2 , ($height - $h) / 2, 0, 0, $w, $h, $this->original_width, $this->original_height);

        $this->image = $image;

        // reset original width and height to the new width and height
        $this->original_width = $width;
        $this->original_height = $height;
    }

    function output($type=NULL) 
    {
        if($type == NULL)
        {
            $type = $this->original_type;   
        }

        if( $type == IMAGETYPE_JPEG ) 
        {
            header('Content-Type: image/jpeg');
            imagejpeg($this->image);
        } 
        else if( $type == IMAGETYPE_GIF ) 
        {
            header('Content-Type: image/gif');
            imagegif($this->image);         
        } 
        else if( $type == IMAGETYPE_PNG ) 
        {
            header('Content-Type: image/png');
            imagepng($this->image);
        }   
    }

}

Я могу что-нибудь сделать, чтобы улучшить этот спектакль?



2165
2
задан 2 июня 2011 в 04:06 Источник Поделиться
Комментарии
2 ответа

Кэш сгенерированных изображений, так что их нужно только после создания.

2
ответ дан 2 июня 2011 в 07:06 Источник Поделиться

Я так понимаю, вы используете GD для обработки изображений. Вы можете посмотреть на ImageMagick в качестве альтернативы, как было показано, чтобы быть быстрее манипулировать изображениями. Есть обзоры , поэтому вопрос здесь.

1
ответ дан 2 июня 2011 в 05:06 Источник Поделиться