Делаем быстрые и красивые превьюшки
При работе с графикой, а именно при создании различных онлайн-галерей, при работе с прикрепленными к статьям файлами в CMS, требуется создание так называемых превьюшек - пропорционально уменьшенных копий изображений. Они могут создаваться динамически или храниться на диске в виде отдельных файлов, все зависит от конкретной задачи. Рассмотрим несколько способов создания превьюшек и сравним их производительность.Сравнение способов создания превьюшек
Для тестов была взята фотография размером 3468 х 2736 пикселов, глубина цветности 24 бита. Цель - разными способами сделать из нее превьюшку размером 200 x 150 пикселов и сохранить результат в файл JPG с наилучшим качеством. Тестовые фрагменты кода максимально облегчены, все размеры и названия файлов захардкодены прямо в исходники. Время выполнения тестов и объем занятой памяти соответствуют моему ноутбуку, эти значения приведены только для сравнения, так что не удивляйтесь, если ваши цифры будут отличаться.
Самый быстрый способ создать превьюшку с изменением размера изображения - функция PHP imageCopyResized. Тестовый код приведен ниже, результат можно посмотреть на первой картинке. Хоть скорость и максимальная, но результат оставляет желать лучшего: превьюшка получилась зернистой. Размер файла превьюшки получился около 39 килобайт.
Code (PHP) : Убрать нумерацию
- $im=imageCreateFromJPEG('image.jpg');
- $tn=imageCreatetrueColor(200,150);
- // Изменить размер исходного изображения до размера превьюшки
- imageCopyResized($tn,$im,0,0,0,0,200,150,3468,2736);
- imageDestroy($im);
- // Сохранить результат в файл
- imageJPEG($tn,'resized.jpg',100);
- imageDestroy($tn);
Code (PHP) : Убрать нумерацию
- $im=imageCreateFromJPEG('image.jpg');
- $tn=imageCreatetrueColor(200,150);
- // Изменить размер исходного изображения до размера превьюшки
- imageCopyResampled($tn,$im,0,0,0,0,200,150,3468,2736);
- imageDestroy($im);
- // Сохранить результат в файл
- imageJPEG($tn,'resampled.jpg',100);
- imageDestroy($tn);
Code (PHP) : Убрать нумерацию
- $im=imageCreateFromJPEG('image.jpg');
- $ds=imageCreatetrueColor(600,450);
- // Изменить размер исходного изображения до промежуточного
- imageCopyResized($ds,$im,0,0,0,0,600,450,3468,2736);
- imageDestroy($im);
- $tn=imageCreatetrueColor(200,150);
- // Изменить размер промежуточного изображения до размера превьюшки
- imageCopyResampled($tn,$ds,0,0,0,0,200,150,600,450);
- imageDestroy($ds);
- // Сохранить результат в файл
- imageJPEG($tn,'combined.jpg',100);
- imageDestroy($tn);
К чему это я все затеял? Да просто опробовал еще одну возможность оптимизации. В галерее домашней странички Васи Пупкина разница между 3 и 0.6 секундами погоды не сделает, а в высоконагруженных проектах, и особенно если требуется создавать изображения "на лету", любой выигрыш во времени будет ощутим.
Просмотров: 8216 | Комментариев: 3
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Тремор
(11.12.2010 в 01:47):
ipSlicer, Вася априори не поймет в чем дело то
Вадим
(01.12.2010 в 18:32):
Спасибо! Как то и не задумывался об этом никогда, принимаем на вооружение.
ipSlicer
(01.12.2010 в 15:42):
"В галерее домашней странички Васи Пупкина разница между 3 и 0.6 секундами погоды не сделает" - сделает-сделает. Вася обычно по 100500 картинок загоняет на сайт, а потом кричит что хостинГ :), ибо васю тупо рубят по max_execution_time. Так что метод подойдет и васе для генерации превьюшек "на лету". Спасибо за тесты.
Добавить комментарий
Заполните форму для добавления комментария