Убираем сжатие изображений товара в openCart на примере версии 1.5.5.1

Автор
Опубликовано: 1222 дня назад (19 февраля 2014)
Блог: Media blog
Рубрика: Php, HTML, CSS и веб
0
Голосов: 0

""
Изображение уменьшено. Щелкните, чтобы увидеть оригинал.

Доброго времени суток! Сейчас я вам расскажу как бороться с принудительным сжатием изображения товаров на cms openCart. Данный хак рассмотрим на примере версии 1.5.5.1 этого движка. В сети встречал несколько "решений" этой проблемы, но они никак не помогали, пришлось поразмышлять самому, в итоге - профит!

Для того, чтобы побороть данную проблему, достаточно всего лишь подкорректировать одну public function в файле, который отвечает за операции с загруженными изображениями.

Данная функция находится в файле ../system/library/image.php - открываем его.

Теперь ищем непосредственно саму функцию, которая именуется как public function resize. (у меня это 38 строка)

Тело функции:
Код PHP:
  1. public function resize($width = 150, $height = 150, $default = '') {
  2. if (!$this->info['width'] || !$this->info['height']) {
  3. return;
  4. }
  5.  
  6. $xpos = 0;
  7. $ypos = 0;
  8. $scale = 1;
  9.  
  10. $scale_w = $width / $this->info['width'];
  11. $scale_h = $height / $this->info['height'];
  12.  
  13. if ($default == 'w') {
  14. $scale = $scale_w;
  15. } elseif ($default == 'h'){
  16. $scale = $scale_h;
  17. } else {
  18. $scale = min($scale_w, $scale_h);
  19. }
  20.  
  21. if ($scale == 1 && $scale_h == $scale_w && $this->info['mime'] != 'image/png') {
  22. return;
  23. }
  24.  
  25. $new_width = (int)($this->info['width'] * $scale);
  26. $new_height = (int)($this->info['height'] * $scale);
  27. $xpos = (int)(($width - $new_width));
  28. $ypos = (int)(($height - $new_height));
  29.  
  30. $image_old = $this->image;
  31. $this->image = imagecreatetruecolor($width, $height);
  32.  
  33. if (isset($this->info['mime']) && $this->info['mime'] == 'image/png') {
  34. imagealphablending($this->image, false);
  35. imagesavealpha($this->image, true);
  36. $background = imagecolorallocatealpha($this->image, 255, 255, 255, 127);
  37. imagecolortransparent($this->image, $background);
  38. } else {
  39. $background = imagecolorallocate($this->image, 255, 255, 255);
  40. }
  41.  
  42. imagefilledrectangle($this->image, 0, 0, $width, $height, $background);
  43.  
  44. imagecopyresampled($this->image, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $this->info['width'], $this->info['height']);
  45. imagedestroy($image_old);
  46.  
  47. $this->info['width'] = $width;
  48. $this->info['height'] = $height;
  49. }
Заменяем данный код на:
Код PHP:
  1. public function resize($width = 150, $height = 150, $default = '') {
  2. if (!$this->info['width'] || !$this->info['height']) {
  3. return;
  4. }
  5.  
  6.  
  7.  
  8. $this->info['width'] = $width;
  9. $this->info['height'] = $height;
  10. }
То есть, как можно увидеть мы просто вырезали часть функции, которая и отвечает за сжатие, а ее остаток сохраняем для того, чтобы не нарушать структуру cms.

Вырезанная часть (то, что для нас лишнее):
Код PHP:
  1. $xpos = 0;
  2. $ypos = 0;
  3. $scale = 1;
  4.  
  5. $scale_w = $width / $this->info['width'];
  6. $scale_h = $height / $this->info['height'];
  7.  
  8. if ($default == 'w') {
  9. $scale = $scale_w;
  10. } elseif ($default == 'h'){
  11. $scale = $scale_h;
  12. } else {
  13. $scale = min($scale_w, $scale_h);
  14. }
  15.  
  16. if ($scale == 1 && $scale_h == $scale_w && $this->info['mime'] != 'image/png') {
  17. return;
  18. }
  19.  
  20. $new_width = (int)($this->info['width'] * $scale);
  21. $new_height = (int)($this->info['height'] * $scale);
  22. $xpos = (int)(($width - $new_width));
  23. $ypos = (int)(($height - $new_height));
  24.  
  25. $image_old = $this->image;
  26. $this->image = imagecreatetruecolor($width, $height);
  27.  
  28. if (isset($this->info['mime']) && $this->info['mime'] == 'image/png') {
  29. imagealphablending($this->image, false);
  30. imagesavealpha($this->image, true);
  31. $background = imagecolorallocatealpha($this->image, 255, 255, 255, 127);
  32. imagecolortransparent($this->image, $background);
  33. } else {
  34. $background = imagecolorallocate($this->image, 255, 255, 255);
  35. }
  36.  
  37. imagefilledrectangle($this->image, 0, 0, $width, $height, $background);
  38.  
  39. imagecopyresampled($this->image, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $this->info['width'], $this->info['height']);
  40. imagedestroy($image_old);
Почти готово! Теперь сохраняем наш файл image.php со всеми изменениями и в корневой папки удаляем все изображения с папки ../image/cache/ (таким образом мы очищаем кэш изображений и при последующей загрузки страницы, картинки будут отображать в оригинальном, не сжатом качестве)

Надеюсь данный пост решил вашу проблему, удачи :)
Комментарии (0)

Нет комментариев. Ваш будет первым!