Как ускорить изменение размеров изображения в приложении CodeIgniter PHP?

У меня есть приложение, которое позволяет пользователям загружать изображения. Тестовый сценарий, который я использую, является jpeg 1.6 МБ с размерами 3872 x 2592 пкс. Сценарий загрузки в бэкенде изменит размер загруженного изображения в 6 дополнительных форматов:

  • квадрат (маленький 75 x 75)
  • Маленький Ползунок (50 x 38)
  • Ползунок (100 x 76)
  • Маленький (240 x 161)
  • Носитель (500 x 378)
  • Большой (1024 x 774)

Я знаю, что это много, но доверяйте мне, мне нужно это. Я делаю изменение размеров с помощью класса Обработки изображения Воспламенителя Кода, который использует или GD, GD2 или ImageMagick, чтобы сделать изменение размеров. Я сначала настроил его для использования GD2 и заметил, что общее количество изменяет размер процесса, берет 11 secs.

Так как пользователь должен ожидать этого процесса, это не приемлемо. После большого чтения я узнал, что ImageMagick является намного более быстрой и эффективной библиотекой управления, таким образом, я переключился на это:

$sourceimage = $data['filedata']['file_path'] . $data['imagedata']['user_id'] . "/" . $imageid . $data['filedata']['file_ext'];
$resize_settings['image_library'] = 'imagemagick';
$resize_settings['library_path'] = '/usr/bin';
$resize_settings['source_image'] = $sourceimage;
$resize_settings['maintain_ratio'] = false;
$resize_settings['quality'] = "100%";
$this->load->library('image_lib', $resize_settings);

К моему большому удивлению изменить размер процесс теперь занимает больше времени: 15 secs, чтобы быть конкретным.

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

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

Так, есть ли какие-либо умные способы существенно ускорить этот процесс изменения размеров так, чтобы я мог сохранить его в режиме реального времени? Просто будьте ясны: обеспечение меньших разрешений не является опцией, это - сайт фотографии, который я создаю. Кроме того, мне действительно нужны эти шесть упомянутых форматов.

7
задан Fer 30 December 2009 в 16:37
поделиться

2 ответа

[

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

] [

]Или же вы можете выполнить в командной строке ImageMagick и выполнить (по крайней мере, большую часть) трансформацию изображения в фоновом режиме, используя процесс, описанный в []Asynchronous shell exec в PHP[].[

]. [

] Наконец, пока это немного не тема, вы собираетесь разрешить портретную ориентацию, или это вряд ли будет фактором? [

]
7
ответ дан 6 December 2019 в 12:51
поделиться

Похоже, что вы уже приняли ответ, но я все равно отправлю свой.

Во-первых, вам действительно не нужно использовать 100% по качеству, значение 90% или 85% отлично подойдет, уменьшив время обработки и размер изображения (если вы мне не верите, просто проведите некоторые тесты).

Я также сделал некоторые тесты с этим изображением и пользовательской функцией JPEG() , первый тестовый случай:

JPEG('./original.jpg', null, '1024*774', './output/large.jpg');
JPEG('./original.jpg', null, '500*378', './output/medium.jpg');
JPEG('./original.jpg', null, '240*161', './output/small.jpg');
JPEG('./original.jpg', null, '100*76', './output/thumb.jpg');
JPEG('./original.jpg', null, '50*38', './output/small_thumb.jpg');
JPEG('./original.jpg', null, '75*75', './output/square.jpg');

Это занимает в среднем 60 секунд на моем медленном медленном компьютере.


Второй тестовый случай :

JPEG('./original.jpg', null, '1024*774', './output/large.jpg');
JPEG('./output/large.jpg', null, '500*378', './output/medium.jpg');
JPEG('./output/medium.jpg', null, '240*161', './output/small.jpg');
JPEG('./output/medium.jpg', null, '100*76', './output/thumb.jpg');
JPEG('./output/medium.jpg', null, '50*38', './output/small_thumb.jpg');
JPEG('./output/medium.jpg', null, '75*75', './output/square.jpg');

Это занимает "всего" 16 секунд (мой компьютер действительно медленный ATM :P), почти в 4 раза быстрее.


Вот функция JPEG() на случай, если вы хотите сделать собственные тесты:

function JPEG($source, $crop = null, $scale = null, $destination = null)
{
    $source = ImageCreateFromJPEG($source);

    if (is_resource($source) === true)
    {
        $size = array(ImageSX($source), ImageSY($source));

        if (isset($crop) === true)
        {
            $crop = array_filter(explode('/', $crop), 'is_numeric');

            if (count($crop) == 2)
            {
                $crop = array($size[0] / $size[1], $crop[0] / $crop[1]);

                if ($crop[0] > $crop[1])
                {
                    $size[0] = $size[1] * $crop[1];
                }

                else if ($crop[0] < $crop[1])
                {
                    $size[1] = $size[0] / $crop[1];
                }

                $crop = array(ImageSX($source) - $size[0], ImageSY($source) - $size[1]);
            }

            else
            {
                $crop = array(0, 0);
            }
        }

        else
        {
            $crop = array(0, 0);
        }

        if (isset($scale) === true)
        {
            $scale = array_filter(explode('*', $scale), 'is_numeric');

            if (count($scale) >= 1)
            {
                if (empty($scale[0]) === true)
                {
                    $scale[0] = $scale[1] * $size[0] / $size[1];
                }

                else if (empty($scale[1]) === true)
                {
                    $scale[1] = $scale[0] * $size[1] / $size[0];
                }
            }

            else
            {
                $scale = array($size[0], $size[1]);
            }
        }

        else
        {
            $scale = array($size[0], $size[1]);
        }

        $result = ImageCreateTrueColor($scale[0], $scale[1]);

        if (is_resource($result) === true)
        {
            if (ImageCopyResampled($result, $source, 0, 0, $crop[0] / 2, $crop[1] / 2, $scale[0], $scale[1], $size[0], $size[1]) === true)
            {
                return ImageJPEG($result, $destination, 90);
            }
        }
    }

    return false;
}
9
ответ дан 6 December 2019 в 12:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: