Оптимизация изображений при загрузке на сайт
Оптимизация изображений при загрузке на сайт
Не секрет, что самый большой объем данных на сервере обычно занимают изображения. От этого напрямую зависит скорость загрузки сайта. Да, файлы картинок можно предварительно подготавливать перед загрузкой, обрабатывать различными программами, но это не всегда удобно. Лучший вариант - автоматически оптимизировать изображения в момент загрузки их на сайт. Хорошо, когда это собственный сервер, где можно устанавливать любые компоненты и писать скрипты для оптимизации, только вот на обычном виртуальном хостинге такие вольности недоступны. Поэтому придется воспользоваться сторонними сервисами.
Сервис TinyPNG
Сервис TinyPNG, которым я давно и с удовольствием пользуюсь, позволяет оптимизировать изображения в формате PNG, JPEG и WebP как вручную через сайт, так и в автоматическом режиме при помощи API. Для доступа к API надо только зарегистрироваться на сайте и получить персональный ключ. В бесплатном режиме доступно не более 500 изображений в месяц, но никто не запрещает иметь стопицот аккаунтов и переключаться на другой при достижении лимита. Вариант с оплатой тоже имеет место быть, но это не наш метод :)
На сайте есть примеры доступа к API на разных языках программирования, в том числе и на PHP. Но там все реализовано в виде громоздких классов, тогда как все можно реализовать буквально в несколько строчек кода. Оптимизировать изображения можно двумя способами: передавать ссылку на изображение и передавать содержимое графического файла напрямую. Начнем с передачи данных по ссылке:
Code (PHP) : Убрать нумерацию
- // Ключ API
- $api_key='123456789aaaabbbbcccdddeeefffggg';
- // Ссылка на обрабатываемое изображение
- $param=array(
- 'source'=>array(
- 'url'=>'https://example.com/original.png'
- )
- );
- // Отправить запрос
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL, 'https://api.tinify.com/shrink');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($param));
- curl_setopt($ch, CURLOPT_HTTPHEADER, array(
- 'Authorization: Basic '.base64_encode('api:'.$api_key),
- 'Content-Type: application/json',
- ));
- $result=curl_exec($ch);
- curl_close($ch);
- if ($json=json_decode($result,true)) {
- if (isset($json['output'], $json['output']['url'])) {
- // Загрузить оптимизированное изображение
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL, $json['output']['url']);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_POST, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- $result=curl_exec($ch);
- curl_close($ch);
- if ($f=fopen('compressed.png','w+')) {
- fwrite($f,$result);
- fclose($f);
- }
- }
- else {
- // Ошибка
- }
- }
- else {
- // Ошибка
- }
Code (PHP) : Убрать нумерацию
- // Ключ API
- $api_key='123456789aaaabbbbcccdddeeefffggg';
- // Прочитать содержимое файла
- $file_name='original.png';
- $f=fopen($file_name,'r');
- $image_data=fread($f,filesize($file_name));
- fclose($f);
- // Отправить запрос
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL, 'https://api.tinify.com/shrink');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $image_data);
- curl_setopt($ch, CURLOPT_HTTPHEADER, array(
- 'Authorization: Basic '.base64_encode('api:'.$api_key),
- ));
- $result=curl_exec($ch);
- curl_close($ch);
- if ($json=json_decode($result,true)) {
- if (isset($json['output'], $json['output']['url'])) {
- // Загрузить оптимизированное изображение
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL, $json['output']['url']);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_POST, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- $result=curl_exec($ch);
- curl_close($ch);
- if ($f=fopen('compressed.png','w+')) {
- fwrite($f,$result);
- fclose($f);
- }
- }
- else {
- // Ошибка
- }
- }
- else {
- // Ошибка
- }
Сервис reSmush.it
Сервис reSmush.it не имеет функции работы через сайт, зато предоставляет неограниченный доступ к API и при этом абсолютно бесплатный. Никаких ключей не требуется, просто берете и используете. Как и у TinyPNG, тут тоже есть два варианта загрузки файлов. При передаче ссылки можно дополнительно указать качество получаемого изображения.
Code (PHP) : Убрать нумерацию
- // Ссылка на изображение
- $source='https://example.com/original.png';
- // Отправить запрос
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'http://api.resmush.it/ws.php?qlty=100&img='.$source);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_POST, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- $result=curl_exec($ch);
- curl_close($ch);
- if ($json=json_decode($result,true)) {
- if (isset($json['dest'])) {
- // Загрузить оптимизированное изображение
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL, $json['dest']);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_POST, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- $result=curl_exec($ch);
- curl_close($ch);
- if ($f=fopen('compressed.png','w+')) {
- fwrite($f,$result);
- fclose($f);
- }
- }
- else {
- // Ошибка
- }
- }
- else {
- // Ошибка
- }
Code (PHP) : Убрать нумерацию
- // Подготовить локальный файл для загрузки
- $file='original.png';
- $info=pathinfo($file);
- $upload=new CURLFile($file, mime_content_type($file), $info['basename']);
- // Отправить запрос
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL, 'http://api.resmush.it/ws.php?qlty=100');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POSTFIELDS, array('files'=>$upload));
- $result=curl_exec($ch);
- curl_close($ch);
- if ($json=json_decode($result,true)) {
- if (isset($json['dest'])) {
- // Загрузить оптимизированное изображение
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL, $json['dest']);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_POST, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- $result=curl_exec($ch);
- curl_close($ch);
- if ($f=fopen('compressed.png','w+')) {
- fwrite($f,$result);
- fclose($f);
- }
- }
- else {
- // Ошибка
- }
- }
- else {
- // Ошибка
- }
Просмотров: 612 | Комментариев: 2
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(07.04.2023 в 17:44):
Здесь нет никаких плагинов, все самописное.
Иван
(07.04.2023 в 17:41):
Добрый день. Тоже использую данный плагин для сжатия. Вопрос такой. а что за плагин у вас используется для подсветки кода, последнее время выкладываю много скриптов на PowerShell и народ жалуется, что они просто текстом без подсветки смотрятся тяжело. Полазил у вас интересный блог, будим дружить
Добавить комментарий
Заполните форму для добавления комментария