Теория обрезки и изменения размера

Мне нужно некоторое руководство по теории обрезки и изменения размера изображений вокруг фокуса с ограничительной рамкой.

В моей ситуации у меня есть различные требования к размеру изображения (например, 100×100, 500×200, 1200×50) при разных разрешениях (1x, 2x, 3x и т. Д.).

Определения эффективно превращают обрезанное изображение 50×50 в обрезанное изображение 100×100, обеспечивая таким образом разрешение 2x для устройств с более высоким разрешением экрана.

Мне предоставляется загруженное изображение пользователя с координатой x, y и ограничительной рамкой с двумя координатами x, y (topLeft [x, y], bottomRight [x, y]).

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

В моей конкретной среде я использую PHP, Laravel и библиотеку Image Intervention, хотя это несколько не имеет значения из-за характера этого вопроса.

1

Решение

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

https://github.com/delboy1978uk/image/blob/master/src/Image.php

Я не писал код для изменения размера и обрезки на основе фокус, но у меня есть resizeAndCrop() Метод, который работает исходя из того, что фокус находится в центре:

public function resizeAndCrop($width,$height)
{
$target_ratio = $width / $height;
$actual_ratio = $this->getWidth() / $this->getHeight();

if($target_ratio == $actual_ratio){
// Scale to size
$this->resize($width,$height);

} elseif($target_ratio > $actual_ratio) {
// Resize to width, crop extra height
$this->resizeToWidth($width);
$this->crop($width,$height,true);

} else {
// Resize to height, crop additional width
$this->resizeToHeight($height);
$this->crop($width,$height,true);
}
}

вот crop() Метод, которым вы можете установить фокус слева, по центру или справа:

/**
* @param $width
* @param $height
* @param string $trim
*/
public function crop($width,$height, $trim = 'center')
{
$offset_x = 0;
$offset_y = 0;
$current_width = $this->getWidth();
$current_height = $this->getHeight();
if($trim != 'left')
{
if($current_width > $width) {
$diff = $current_width - $width;
$offset_x = ($trim == 'center') ? $diff / 2 : $diff; //full diff for trim right
}
if($current_height > $height) {
$diff = $current_height - $height;
$offset_y = ($trim = 'center') ? $diff / 2 : $diff;
}
}
$new_image = imagecreatetruecolor($width,$height);
imagecopyresampled($new_image,$this->_image,0,0,$offset_x,$offset_y,$width,$height,$width,$height);
$this->_image = $new_image;
}

Я не буду объяснять imagecopyresampled() так как вы просто искали теорию обрезки, но документы здесь http://php.net/manual/en/function.imagecopyresampled.php

Помните, что изменение размера изображений с помощью PHP-библиотеки GD требует большого объема памяти, в зависимости от размера изображения. Я люблю использовать imagemagick, в котором PHP есть класс-обёртка ImagickСтоит посмотреть, если у вас возникнут проблемы.

Я надеюсь, что это поможет вам, удачи!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]