Уменьшение картинки при загрузке
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
