В модель:
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;
}