Уменьшение картинки при загрузке
2022-03-31
Работа с OpenCart подразумевает наполнение каталога товаров информацией о товарах и их изображениями. В большинстве случаев, менеджеры не задумываются об оптимизации изображений, и просто загружают их, скачав с другого сайта. Такой подход неправильный изначально - сначала картинку нужно подготовить, а потом уже загружать. Но для этого нужно обучить менеджера, а это лишняя работа. Поэтому чтобы как-то смягчить ситуацию нужно организовать как минимум автоматический ресайз загружаемых картинок.
За загрузку файлов, отвечает менеджер файлов, находится здесь - admin/controller/common/filemanager.php. Сюда нужно добавить новую функцию resize, непосредственно перед функцией public function upload().
public function resize($file){ global $tmp_path; $max_width = 500; $max_height = 500; if ($file['type'] == 'image/jpeg') $source = imagecreatefromjpeg($file['tmp_name']); elseif ($file['type'] == 'image/png') $source = imagecreatefrompng($file['tmp_name']); elseif ($file['type'] == 'image/gig') $source = imagecreatefromgif($file['tmp_name']); else echo "Uncorrect max file resolution"; $width = imagesx($source); $height = imagesy($source); if ($width > $max_width) { $ratio = $width/$max_width; $w_dest = round($width/$ratio); $h_dest = round($height/$ratio); } elseif ($height > $max_height) { $ratio = $height/$max_height; $w_dest = round($width/$ratio); $h_dest = round($height/$ratio); } $dest = imagecreatetruecolor($w_dest,$h_dest); imagecopyresampled($dest, $source, 0, 0, 0, 0, $w_dest, $h_dest, $width, $height); if ($file['type'] == 'image/jpeg') imagejpeg($dest, $tmp_path.$file['tmp_name'], 80); elseif ($file['type'] == 'image/png') imagepng($dest, $tmp_path.$file['tmp_name'], 100); elseif ($file['type'] == 'image/gif') imagegif($dest, $tmp_path.$file['tmp_name'], 100); imagedestroy($source); imagedestroy($dest); return $file; }
Эта функция, смотрит файл картинки, и если ее размеры превышают допустимые, указанные в переменных $max_width и $max_height, то изменяет ее до разрешенных. Изменение размера происходит пропорционально. Также изменяется качество jpg формата до 80%, что позволяет уменьшить объем файла.
Теперь нужно применить эту функцию к каждому загружаемому файлу. Сделать это можно в функции upload.
$size = getimagesize($file['tmp_name']); print_r($size); if (($size[0] > 500) OR ($size[1] > 500)){ $file = $this->resize($file); }
Этот код нужно разместить между строками:
if (!$json) { move_uploaded_file($file['tmp_name'], $directory . '/' . $filename);
В итоге должно получиться так:
if (!$json) { $size = getimagesize($file['tmp_name']); print_r($size); if (($size[0] > 500) OR ($size[1] > 500)){ $file = $this->resize($file); } move_uploaded_file($file['tmp_name'], $directory . '/' . $filename);
Теперь при загрузке файлов, все изображения будут прогоняться через эту функцию авторесайза. Данная модификация писалась для OpenCart 2.3, но думаю должно пойти и для более ранних и поздних версий.
Скачать готовый файл можно по ссылке filemanager