Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Исправить image.php для сохранения оригинальных пропорций изображений.


Recommended Posts

Здравствуйте. У меня ocStore 2.1.0.2.1

 

Хочу чтобы загружаемые на сайт изображения сохраняли свои оригинальные пропорции, но при этом фукнционал resize для изображений сохранялся.

 

Например:

- Загружаю на сайт 2 товара, изображение первого 2000x1000px (ландшафтное), второго 1000x1000px (квадратное).

- В настройках магазина в Изображениях для Изображение с списке товаров ставлю, допустим 600х400

 

Хочу получить в Категории товаров изображение первого товара 600х300, а второго 400х400, 

то есть нужно сделать, чтобы размеры изображений, задаваемых в админке означали НЕ БОЛЕЕ 600x400 итд, а не строго 600х400 как в OC по дефолту.

 

В файле system/library/image.php в 92-й строке:

$scale = min($scale_w, $scale_h);

поменял min на max, но, понимаю, что код ниже формирует белую подложку, на которую потом позиционирует изображение + водяные знаки, что делать дальше не знаю.

 

На водяные знаки можно забить, мне они ненужны, белую подложку можно вообще не формировать (кажись это и надо сделать).

 

Готов заплатить за ваши знания.

 

Вот сам этот файлик image.php:

Spoiler

<?php
class Image {
	private $file;
	private $image;
	private $width;
	private $height;
	private $bits;
	private $mime;

	public function __construct($file) {
		if (file_exists($file)) {
			$this->file = $file;

			$info = getimagesize($file);

			$this->width  = $info[0];
			$this->height = $info[1];
			$this->bits = isset($info['bits']) ? $info['bits'] : '';
			$this->mime = isset($info['mime']) ? $info['mime'] : '';

			if ($this->mime == 'image/gif') {
				$this->image = imagecreatefromgif($file);
			} elseif ($this->mime == 'image/png') {
				$this->image = imagecreatefrompng($file);
			} elseif ($this->mime == 'image/jpeg') {
				$this->image = imagecreatefromjpeg($file);
			}
		} else {
			exit('Error: Could not load image ' . $file . '!');
		}
	}

	public function getFile() {
		return $this->file;
	}

	public function getImage() {
		return $this->image;
	}

	public function getWidth() {
		return $this->width;
	}

	public function getHeight() {
		return $this->height;
	}

	public function getBits() {
		return $this->bits;
	}

	public function getMime() {
		return $this->mime;
	}

	public function save($file, $quality = 90) {
		$info = pathinfo($file);

		$extension = strtolower($info['extension']);

		if (is_resource($this->image)) {
			if ($extension == 'jpeg' || $extension == 'jpg') {
				imagejpeg($this->image, $file, $quality);
			} elseif ($extension == 'png') {
				imagepng($this->image, $file);
			} elseif ($extension == 'gif') {
				imagegif($this->image, $file);
			}

			imagedestroy($this->image);
		}
	}

	public function resize($width = 0, $height = 0, $default = '') {
		if (!$this->width || !$this->height) {
			return;
		}

		$xpos = 0;
		$ypos = 0;
		$scale = 1;

		$scale_w = $width / $this->width;
		$scale_h = $height / $this->height;

		if ($default == 'w') {
			$scale = $scale_w;
		} elseif ($default == 'h') {
			$scale = $scale_h;
		} else {
			$scale = min($scale_w, $scale_h);
		}

		if ($scale == 1 && $scale_h == $scale_w && $this->mime != 'image/png') {
			return;
		}

		$new_width = (int)($this->width * $scale);
		$new_height = (int)($this->height * $scale);
		$xpos = (int)(($width - $new_width) / 2);
		$ypos = (int)(($height - $new_height) / 2);

		$image_old = $this->image;
		$this->image = imagecreatetruecolor($width, $height);

		if ($this->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);
		}

		imagefilledrectangle($this->image, 0, 0, $width, $height, $background);

		imagecopyresampled($this->image, $image_old, $xpos, $ypos, 0, 0, $new_width, $new_height, $this->width, $this->height);
		imagedestroy($image_old);

		$this->width = $width;
		$this->height = $height;
	}

	public function watermark($watermark, $position = 'bottomright') {
		switch($position) {
			case 'topleft':
				$watermark_pos_x = 0;
				$watermark_pos_y = 0;
				break;
			case 'topright':
				$watermark_pos_x = $this->width - $watermark->getWidth();
				$watermark_pos_y = 0;
				break;
			case 'bottomleft':
				$watermark_pos_x = 0;
				$watermark_pos_y = $this->height - $watermark->getHeight();
				break;
			case 'bottomright':
				$watermark_pos_x = $this->width - $watermark->getWidth();
				$watermark_pos_y = $this->height - $watermark->getHeight();
				break;
		}

		imagecopy($this->image, $watermark->getImage(), $watermark_pos_x, $watermark_pos_y, 0, 0, $watermark->getWidth(), $watermark->getHeight());

		imagedestroy($watermark->getImage());
	}

	public function crop($top_x, $top_y, $bottom_x, $bottom_y) {
		$image_old = $this->image;
		$this->image = imagecreatetruecolor($bottom_x - $top_x, $bottom_y - $top_y);

		imagecopy($this->image, $image_old, 0, 0, $top_x, $top_y, $this->width, $this->height);
		imagedestroy($image_old);

		$this->width = $bottom_x - $top_x;
		$this->height = $bottom_y - $top_y;
	}

	public function rotate($degree, $color = 'FFFFFF') {
		$rgb = $this->html2rgb($color);

		$this->image = imagerotate($this->image, $degree, imagecolorallocate($this->image, $rgb[0], $rgb[1], $rgb[2]));

		$this->width = imagesx($this->image);
		$this->height = imagesy($this->image);
	}

	private function filter() {
        $args = func_get_args();

        call_user_func_array('imagefilter', $args);
	}

	private function text($text, $x = 0, $y = 0, $size = 5, $color = '000000') {
		$rgb = $this->html2rgb($color);

		imagestring($this->image, $size, $x, $y, $text, imagecolorallocate($this->image, $rgb[0], $rgb[1], $rgb[2]));
	}

	private function merge($merge, $x = 0, $y = 0, $opacity = 100) {
		imagecopymerge($this->image, $merge->getImage(), $x, $y, 0, 0, $merge->getWidth(), $merge->getHeight(), $opacity);
	}

	private function html2rgb($color) {
		if ($color[0] == '#') {
			$color = substr($color, 1);
		}

		if (strlen($color) == 6) {
			list($r, $g, $b) = array($color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5]);
		} elseif (strlen($color) == 3) {
			list($r, $g, $b) = array($color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2]);
		} else {
			return false;
		}

		$r = hexdec($r);
		$g = hexdec($g);
		$b = hexdec($b);

		return array($r, $g, $b);
	}
}

 

 

Змінено користувачем sssergey
Надіслати
Поділитися на інших сайтах


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

 

Надіслати
Поділитися на інших сайтах

4 minutes ago, Vetroff said:

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

 

Да, именно это и надо сделать. Сам я не смогу.

Надіслати
Поділитися на інших сайтах


Вопрос не сложный, но с телефона писать не удобно ))

Если никто не подскажет, напишите через часов 4-5 в личку, доберусь до компа...

Надіслати
Поділитися на інших сайтах

1 minute ago, Vetroff said:

Вопрос не сложный, но с телефона писать не удобно ))

Если никто не подскажет, напишите через часов 4-5 в личку, доберусь до компа...

Ок, спасибо, напишу.

Надіслати
Поділитися на інших сайтах


4 часа назад, sssergey сказал:

Готов заплатить за ваши знания.

 

 

 

Какая угодно гибкая настройка ваших изображений.  Практически, изображение можно настроить самым разным способом.

Все мыслимые требования, которые появлялись у заказчиков, уже давно реализованы.

Свою задачу сможете решить.

Плюс приятным бонусом сжатие изображений для поднятия оценки гуглом.

Надіслати
Поділитися на інших сайтах

Спасибо, но этот модуль не решит моего вопроса, он для другого. Картинки я обрабатываю до заливки на сайт. Речь именно о сохранении оригинальных пропорций.

Надіслати
Поділитися на інших сайтах


17 минут назад, sssergey сказал:

Спасибо, но этот модуль не решит моего вопроса, он для другого. Картинки я обрабатываю до заливки на сайт. Речь именно о сохранении оригинальных пропорций.

Ну вы же в настройках opencart четко указываете какой размер должен быть
Как вы себе представляете "пропорции"? Т е одна картинка будет больше другой по ширине и т п

Надіслати
Поділитися на інших сайтах

Я предполагаю что после правки image.php и вашем модуле SEO CMS TOP2 thumbnails-ы будут такими же (с оригинальным соотношение сторон заливаемых картинок), или ваш модуль не через это режет? В вашем модуле мне тоже надо чтобы так работало. О-о-очень надо!

Змінено користувачем sssergey
Надіслати
Поділитися на інших сайтах


Ну что, благодаря таким хорошим людям как SAPER1985 и Vetroff задача была решена!

Всё работает так, как и хотелось, мало того, изображения Записей модуля SEO CMS TOP2 тоже теперь кропятся сохраняя свои оригинальные пропорции.

 

:-o

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.