Из документации PHP:
bool imagecopyresampled ( 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 )
imagecopyresampled () копирует прямоугольную часть одного изображения в другое, плавно интерполируя значения пикселей, так что, в частности, уменьшение размера изображения все еще сохраняет большиеЯсность.
Другими словами, imagecopyresampled () возьмет прямоугольную область из src_image ширины src_w и высоты src_h в позиции (src_x, src_y) и поместит ее в прямоугольную область dst_image ширины dst_w ивысота dst_h в позиции (dst_x, dst_y).
Таким образом, чтобы получить результат, который вы ищете, вам нужно избегать масштабирования.для этого используйте:
imagecopy($dst, $src, 0, 0, $x1, $y1, $w, $h);
// this can also be done but is less efficient (over 10 times slower)
imagecopyresampled($dst, $src, 0, 0, (int) $x1, (int) $y1, $w, $h, $w, $h);
Здесь мы берем прямоугольник такого же размера из источника, как мы помещаем его в конечное изображение.
Я только что проверил его, и он прекрасно работает.
Обновление: Я только что повторил попытку на своем тестовом сервере, и он работает нормально.Я использую следующий код:
$filename = "test.jpg";
extract($_GET);
$src = imagecreatefromjpeg($filename);
$dst = imagecreatetruecolor($w, $h);
imagecopy($dst, $src, 0, 0, $x1, $y1, $w, $h);
// this is over 10 times slower, as we are only cropping we should use imagecopy
//imagecopyresampled($dst, $src, 0, 0, $x1, $y1, $w, $h, $w, $h);
header('Content-Type: image/jpeg');
imagejpeg($dst);
И я называю это так:
http://localserver/test/gd_crop.php?x1=906&y1=267&w=501&h=355
ПроизводительностьОбновление
Поскольку мы не изменяем размеры, мы можем просто использовать imagecopy
.Выполнение 3-х функций, как я измерил, дано ниже.
imagecopyresampled 69ms
imagecopyresized 5.5ms
imagecopy 4.5ms
Таким образом, существует разница в 10 скоростей между пересчитанной и двумя другими функциями.
Я наконец-то пришел к следующей строке вместо функции imagecopyresampled
, попробуйте, я также обновил приведенный выше листинг кода:
imagecopy($dst, $src, 0, 0, $x1, $y1, $w, $h);