Вставлю свои 5 копеек :)
2 функции - ресайз изображений с зумом (если не пропорционально, то картинка приближается для заполнения окна и белых полос нет)
Установка:
1) Открываем файл /catalog/models/tool/image.php и перед
public function resize($filename, $width, $height) {
вставляем
public function myresize($filename, $width, $height) {
if (!file_exists(DIR_IMAGE . $filename) || !is_file(DIR_IMAGE . $filename)) {
return;
}
$info = pathinfo($filename);
$extension = $info['extension'];
$old_image = $filename;
$new_image = 'cache/' . substr($filename, 0, strrpos($filename, '.')) . '-' . $width . 'x' . $height . '.' . $extension;
if (!file_exists(DIR_IMAGE . $new_image) || (filemtime(DIR_IMAGE . $old_image) > filemtime(DIR_IMAGE . $new_image))) {
$path = '';
$directories = explode('/', dirname(str_replace('../', '', $new_image)));
foreach ($directories as $directory) {
$path = $path . '/' . $directory;
if (!file_exists(DIR_IMAGE . $path)) {
@mkdir(DIR_IMAGE . $path, 0777);
}
}
$image = new Image(DIR_IMAGE . $old_image);
$image->myresize($width, $height);
$image->save(DIR_IMAGE . $new_image);
}
if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) {
return HTTPS_IMAGE . $new_image;
} else {
return HTTP_IMAGE . $new_image;
}
}
2) Файл /system/library/image.php
перед
public function resize($width = 0, $height = 0) {
вставляем
public function myresize($width = 0, $height = 0) {
if (!$this->info['width'] || !$this->info['height']) {
return;
}
$x = $this->info['width'];
$y = $this->info['height'];
// old images width will fit
if(($x / $y) < ($width/$height)){
$scale = $width/$x;
$newX = 0;
$newY = - ($scale * $y - $height) / 2;
// else old image's height will fit
}else{
$scale = $height/$y;
$newX = - ($scale * $x - $width) / 2;
$newY = 0;
}
$image_old = $this->image;
$this->image = imagecreatetruecolor($width, $height);
$new_width = $scale * $x;
$new_height = $scale * $y;
// now use imagecopyresampled
imagecopyresampled($this->image, $image_old, $newX, $newY, 0, 0, $new_width, $new_height, $x, $y);
if (isset($this->info['mime']) && $this->info['mime'] == 'image/png') {
imagealphablending($this->image, false);
imagesavealpha($this->image, true);
$background = imagecolorallocatealpha($this->image, 255, 255, 255, 127);
imagecolortransparent($this->image, $background);
} else {
$background = imagecolorallocate($this->image, 255, 255, 255);
}
imagedestroy($image_old);
$this->info['width'] = $width;
$this->info['height'] = $height;
}
3) теперь везде используется пока стандартная функция ресайза. Если вы хотите использовать новую, например в категории (в списке отображения товаров), то вам нужно открыть файл /catalog/controller/product/category.php, найти там $this->model_tool_image->resize и заменить на $this->model_tool_image->myresize. И так везьде где вам нужно. Не забудьте зайти потом в папку /image/cache/data и удалить кшированые изображения со старым ресайзом