imagecopyresampled для изменения размера и обрезки изображения - не возвращает ожидаемый результат


imagecopyresized ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )

Вот что я хочу сделать: у меня есть изображение размером 600x1000 пикселей, и я хочу создать большой палец размером 100x100 пикселей после изменения размера этого изображения до 300x500px, координата x для верхней левой точки квадрата большого пальца должна быть 100(src x) и 120(src y).

Согласно тому, что я понимаю из руководства, команда должна быть

$dst_image = imagecreatetruecolor(100,100);
$src_image = imagecreatefromjpeg('/home/sandbox/imagetoresize.jpg');
imagecopyresized ($dst_image, $src_image, 0, 0, 100, 120, **300 , 500 , 600 , 1000** )

Он просто отлично обрезает изображение, но неправильно изменяет его размер. У меня никогда не получалось соответствовать тому, что я вижу на своем изображении редактор (the GIMP). Что я делаю не так? Я подтвердил, что все цифры верны, но они всегда сдвигаются вверх или вниз, что бы я ни делал.

Author: j0k, 2011-01-08

2 answers

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

Http://www.spotlesswebdesign.com/blog.php?id=1

Обновление

Это должно выглядеть примерно так.

$dst_image = imagecreatetruecolor(100,100);
$src_image = imagecreatefromjpeg('/home/sandbox/imagetoresize.jpg');
imagecopyresized ($dst_image, $src_image, 0, 0, 100, 120, 100, 100, 400, 400);

Берет квадрат 400x400 из источника и копирует его в квадрат 100x100 в пункте назначения. вверху слева от источника квадрат равен 100 x и 120 y. x и y представляют количество пикселей в верхнем левом углу.

 10
Author: dqhendricks, 2011-01-08 04:33:02

Да, это все хорошо исправило.

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

imagecopyresized ($dst_image, $src_image, 0, 0, 200, 240, 100, 100, 200, 200);

Таким образом, переменные на самом деле означают следующее: $src_x = координата x верхней левой точки квадрата в оригинале. Поскольку оригинал в два раза больше версии с измененным размером, из которой большой палец должен будет извлечено, это будет 200 ((original_width /измененная ширина) *x).

$src_y = то же самое, но с координатой y.

$dst_w = ширина сгенерированного эскиза - 100.

$dst_h = высота сгенерированного эскиза - 100.

$src_w = ширина области, которую я буду обрезать из оригинала ((original_width /измененная ширина) * $dst_w)

$src_h = высота области, которую я буду обрезать с оригинала ((original_width /измененная ширина) * $dst_h)


Dqhendricks: Большое спасибо за вашу помощь, я действительно ценю ее. Я часами ломал над этим голову.

 3
Author: David, 2011-01-08 14:19:08