V
V
Valery Vitalievich2021-02-18 15:34:57
opencart
Valery Vitalievich, 2021-02-18 15:34:57

How to crop the main photo to the short side of opencart 2.3?

Good afternoon! There is a nice modification for opencart 2.3, it cuts all the photos into squares when loading. Help to remake so that only the main product image would be cut off on the smaller side (in categories, in search ... etc.)
/catalog/model/tool/image.php

<?php
class ModelToolImage extends Model {
  public function resize($filename, $width, $height, $type = "") {

        if (!file_exists(DIR_IMAGE . $filename) || !is_file(DIR_IMAGE . $filename)) {
            return;
        }

        $info = pathinfo($filename);

        $extension = $info['extension'];

        $old_image = $filename;

        $new_image = 'cache/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . $width . 'x' . $height . $type .'.' . $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);
                }
            }

            list($width_orig, $height_orig) = getimagesize(DIR_IMAGE . $old_image);

            if ($width_orig != $width || $height_orig != $height) {

                $scaleW = $width_orig/$width;
                $scaleH = $height_orig/$height;

                $image = new Image(DIR_IMAGE . $old_image);

                if ($scaleH > $scaleW) {
                    $_height = $height * $scaleW;

                    $top_x = 0;
                    $top_y = ($height_orig - $_height) / 2;

                    $bottom_x = $width_orig;
                    $bottom_y = $top_y + $_height;

                    $image->crop($top_x, $top_y, $bottom_x, $bottom_y);
                } elseif ($scaleH < $scaleW) {
                    $_width = $width * $scaleH;

                    $top_x = ($width_orig - $_width) / 2;
                    $top_y = 0;

                    $bottom_x = $top_x + $_width;
                    $bottom_y = $height_orig;

                    $image->crop($top_x, $top_y, $bottom_x, $bottom_y);
                }

                $image->resize($width, $height, $type);
                $image->save(DIR_IMAGE . $new_image);
            } else {
                copy(DIR_IMAGE . $old_image, DIR_IMAGE . $new_image);
            }
        }        

        if ($this->request->server['HTTPS']) {
            return $this->config->get('config_ssl') . 'image/' . $new_image;
        } else {
            return $this->config->get('config_url') . 'image/' . $new_image;
        }
    }
}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
M
maxeee52, 2021-02-18
@valera_91

Per model:

function cropsize($filename, $width, $height) {

        if (!is_file(DIR_IMAGE . $filename) || substr(str_replace('\\', '/', realpath(DIR_IMAGE . $filename)), 0, strlen(DIR_IMAGE)) != str_replace('\\', '/', DIR_IMAGE)) {
            return null;
        }

        $extension = pathinfo($filename, PATHINFO_EXTENSION);

        $old_image = $filename;
        $new_image = 'cache/' . substr($filename, 0, strrpos($filename, '.')) . '-cr-' . $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->cropsize($width, $height);
            $image->save(DIR_IMAGE . $new_image);
        }

        if ($this->request->server['HTTPS']) {
            return $this->config->get('config_ssl') . 'image/' . $new_image;
        } else {
            return $this->config->get('config_url') . 'image/' . $new_image;
        }

    }

В system/library/image
public function cropsize($width = 0, $height = 0) {
      
      	if (!$this->info['width'] || !$this->info['height']) {
      		return;
      	}
        
          //afmetingen bepalen
          $photo_width = $this->info['width']; 
          $photo_height = $this->info['height'];
          
          $new_width = $width;
          $new_height = $height;
          
          //als foto te hoog is
          if (($photo_width/$new_width) < ($photo_height/$new_height)) {
          
          	$from_y = ceil(($photo_height - ($new_height * $photo_width / $new_width))/2);
          	$from_x = '0';
          	$photo_y = ceil(($new_height * $photo_width / $new_width)); 
          	$photo_x = $photo_width;
          
          }
          
          //als foto te breed is
          if (($photo_height/$new_height) < ($photo_width/$new_width)) {

          	$from_x = ceil(($photo_width - ($new_width * $photo_height / $new_height))/2);
          	$from_y = '0';
          	$photo_x = ceil(($new_width * $photo_height / $new_height)); 
          	$photo_y = $photo_height;

        	}
          
          //als verhoudingen gelijk zijn	
          if (($photo_width/$new_width) == ($photo_height/$new_height)) {
          
          	$from_x = ceil(($photo_width - ($new_width * $photo_height / $new_height))/2);
          	$from_y = '0';
          	$photo_x = ceil(($new_width * $photo_height / $new_height)); 
          	$photo_y = $photo_height;
          
          }
          
          	        
         	$image_old = $this->image;
          $this->image = imagecreatetruecolor($width, $height);
      
      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);
      }
      
      imagefilledrectangle($this->image, 0, 0, $width, $height, $background);
    
    
          imagecopyresampled($this->image, $image_old, 0, 0, $from_x, $from_y, $new_width, $new_height, $photo_x, $photo_y);
          imagedestroy($image_old);
             
          $this->info['width']  = $width;
          $this->info['height'] = $height;

      
      }

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question