Как сделать гравитационное увеличение в CodeIgniter с помощью Imagemagick? - PullRequest
1 голос
/ 02 мая 2011

Я пытаюсь обрезать изображение (полученное с помощью Curl) таким образом, чтобы обрезанное изображение было 171 x 118px. Вместо того, чтобы принудительно изменить размер изображения до 171x118px, я пытаюсь заставить его работать таким образом, чтобы он захватывал любую область изображения размером 171x118px и обрезал ее. Таким образом, исходное изображение http://www.mirzar.com/ember/actual-image.png, должно вывести http://www.mirzar.com/ember/desired-crop.png вместо http://www.mirzar.com/ember/cropped.png.

Вот мой код:

            $config['image_library']  = 'ImageMagick';
            $config['library_path']   = '/usr/bin/';
            $config['create_thumb']   = TRUE;
            $config['maintain_ratio'] = FALSE;
            $this->load->library('image_lib', $config);
            $dimensions[0] = array('x'=>171, 'y'=>118, 'dir'=>'small');
            $dimensions[1] = array('x'=>154, 'y'=>105, 'dir'=>'medium');
            $dimensions[2] = array('x'=>312, 'y'=>164, 'dir'=>'large');
            for ($i=0; $i<3;$i++){
                $filesize = filesize($filename);
                $config['image_library']  = 'ImageMagick';
                $config['library_path']   = '/usr/bin/';
                $config['source_image']   = $filename;
                $config['create_thumb']   = TRUE;
                $config['maintain_ratio'] = FALSE;
                $config['width'] = $dimensions[$i]['x'];
                /* $config['height'] = $dimensions[$i]['y']; */
                $config['master_dim'] = 'width';

                $this->image_lib->test();
                $this->image_lib->initialize($config);
                $this->image_lib->resize();
                $this->saveThumbnail($imageid, $ext, $dimensions[$i]['dir'], $i); 
            }

            // regular site pic
            $config['width']          = 171;
            $config['height']         = 218;
            $this->load->library('image_lib', $config);
            $this->image_lib->resize();

1 Ответ

1 голос
/ 03 мая 2011

Во-первых, кажется, что ваши «малые» и «средние» измерения неверны в массиве измерений.

Что касается самой задачи, вы можете просто использовать функцию «обрезать» codeigniter длядать вам правильные размеры для миниатюры.Есть несколько методов, которые вы можете использовать:

1) Измените размер изображения, используя метод, который вы описываете, за исключением сохранения соотношения изображений и использования $config['master_dim'] = 'auto';.Затем используйте функцию обрезки, чтобы обрезать изображение с измененным размером до желаемых размеров.Этот метод имеет дополнительный бонус компенсации за изображения, которые могут быть меньше, чем ваши эскизы!

2) Обрезать изображение с самого начала и игнорировать изменение размера в целом.

В любом случае, вы быдобавив что-то вроде этого:

$config['x_axis'] = 0;
$config['y_axis'] = 0;
$config['width'] = $dimensions[$i]['x'];
$config['height'] = $dimensions[$i]['y'];
$this->image_lib->initialize($config);
$this->image_lib->crop();

Третий метод, который позволит создать намного более аккуратные миниатюры, состоит в определении «наилучшего соответствия» для каждого изображения.Что-то вроде следующего:

$size = getimagesize($filename);
$width_ratio = floor($size[0] / $dimensions[$i]['x']);
$height_ratio = floor($size[1] / $dimensions[$i]['y']);
$min_ratio - min($width_ratio, $height_ratio);
$left = (($size[0] - ($dimensions[$i]['x'] * $min_ratio)) / 2);
$right = (($size[1] - ($dimensions[$i]['y'] * $min_ratio)) / 2);
$config['width'] = ($dimensions[$i]['x'] * $min_ratio);
$config['height'] = ($dimensions[$i]['y'] * $min_ratio);
$config['x_axis'] = $left;
$config['y_axis'] = $right;
$this->image_lib->initialize($config);
$this->image_lib->crop();

Затем измените размер этого нового изображения до нужного вам размера миниатюры.

Имейте в виду, я не проверял отношения меньше 0, я оставлючто вам.

С уважением, eyaka1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...