Уменьшение картинки при загрузке

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