7

Функция imagecopyresampled полезна для создания эскиза или изменить размер изображения, сохраняя при этом соотношение сторон:Select PHP, изменение размера алгоритм

$fn = $_FILES['data']['tmp_name']; 
$size = getimagesize($fn); 
$width = $size[0]; 
$height = $size[1]; 
$ratio = $width/$height; 
if ($ratio > 1 && $size[0] > 500) { $width = 500; $height = 500/$ratio; } 
else { if ($ratio <= 1 && $size[1] > 500) { $width = 500 * $ratio; $height = 500; }} 
$src = imagecreatefromstring(file_get_contents($fn)); 
$dst = imagecreatetruecolor($width, $height); 
imagecopyresampled($dst, $src, 0, 0, 0, 0, $width, $height, $size[0], $size[1]); 
imagedestroy($src); 
imagejpeg($dst, 'test.jpg'); 
imagedestroy($dst); 

Как выбрать алгоритм изменения размера используемого PHP?
Примечание: как указано in this question, установка imagesetinterpolation($dst, IMG_BILINEAR_FIXED); или такие вещи не работают.


Согласно тестам, которые я сделал (на другом языке), «билинейной изменение размера» иногда дает лучший результат, чем бикубический, а иногда наоборот (зависит, если это сокращение или преобразования).

+0

Как отметил [здесь] (http://php.net/manual/fr/function.imagecopyresampled.php#54448): «Следует отметить, что функция imagecopyresampled() гораздо более размыта, чем Photoshop CS default bicubic funtion и похож на туманную версию билинейной функции Photoshop. В документации не указано, какой алгоритм используется при повторной выборке ». – Basj

+1

Похоже, что это не относится к imagecopyresampled - я удалю его как неправильное, пока я пытаюсь его обработать. Сожалею. –

+0

Как указано [в этом вопросе] (http://stackoverflow.com/q/41729409/1422096), установка 'imagesetinterpolation ($ dst, IMG_BILINEAR_FIXED);' или такие вещи, похоже, не работают. – Basj

ответ

8

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

imagescale($image, $new_width, $new_height, $algorithm); 

Согласно документации $algorithm может быть:

Один из IMG_NEAREST_NEIGHBOUR, IMG_BILINEAR_FIXED, IMG_BICUBIC, IMG_BICUBIC_FIXED или что-нибудь еще (будет использовать два прохода).

Тест на PHP 7.0.15 (сравнивая хэш файла) показывает, что Бикубический и BICUBIC_FIXED результат в другом изображении, в то время как BILINEAR_FIXED и NEAREST_NEIGHBOUR результат в том же изображении.

+0

Кажется замечательным! Я буду тестировать как можно скорее. – Basj

+1

@Basj это - ответ, который я собираюсь дать самому себе. Я думаю, что это правильно для ваших нужд ...? –

0

Почему вы не используете библиотеку? Я думаю, что если вы будете использовать php-библиотеку, это будет проще. Попробуйте this one. Надеюсь, это поможет вам.

+0

@Cakpep проверить новое редактирование и перечитать для истинного значения вопроса. Вы можете [** 'редактировать' **] (http://stackoverflow.com/posts/41889086/edit) свой ответ с новой информацией, если хотите ... –

+0

спасибо, извините за мой плохой компромисс: D – cakpep

+0

Эта библиотека не позволит изменять алгоритм. См. [Этот комментарий] (https://github.com/eventviva/php-image-resize/issues/68): 'http://php.net/manual/en/function.imagecopyresampled.php, это функция, используемая внутри библиотеки. Я не мог найти информацию о том, какой алгоритм используется функцией. ' – Basj

0

Ну, вы можете скачать PHP Source, добавить свою функцию фильтра и скомпилировать php.

здесь вы можете найти фильтры https://github.com/php/php-src/blob/master/ext/gd/libgd/gd_interpolation.c#L481

здесь имеет место переключатель, где вы должны применить метод https://github.com/php/php-src/blob/master/ext/gd/libgd/gd_interpolation.c#L2530

здесь вы можете определить константы https://github.com/php/php-src/blob/master/ext/gd/libgd/gd.h#L137

счастливым хакерство: D

+0

В этом ответе нет ничего плохого. Это правильно для предыдущей формулировки вопроса, которая предложила Аскеру захотеть изменить исходный код алгоритма повторной выборки. Я редактировал вопрос. @VitalijMik, проверьте новое редактирование, если вы хотите [** 'change' **] (http://stackoverflow.com/posts/41889429/edit) ваш ответ также ... –

4

imagecopyresampled основан/частично LibGD, взглянув на исходный код LibGD, вы можете ясно видеть его implementation, а также документация n Ot неоднозначным о используемом алгоритме, как это указано, что:

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

Итак, как вы можете выбрать алгоритм изменения размера, используемый PHP?

Если у вас есть insist/must, используйте функции LibGD, вы не можете (если вы не перекомпилируете PHP с помощью вилки LibGD, вы код для этого вопроса).

Однако, если вы можете использовать другую библиотеку манипуляций с изображениями, вы можете просто использовать тот, который использует другой алгоритм для изменения размера, например Imagick предлагает широкий диапазон интерполяций, но поскольку documentation довольно невнимателен к этому здесь константы, необходимые для использования Imagick::setImageInterpolateMethod(int $) метода:

const INTERPOLATE_UNDEFINED = 0; 
const INTERPOLATE_AVERAGE = 1; 
const INTERPOLATE_BICUBIC = 2; 
const INTERPOLATE_BILINEAR = 3; 
const INTERPOLATE_FILTER = 4; 
const INTERPOLATE_INTEGER = 5; 
const INTERPOLATE_MESH = 6; 
const INTERPOLATE_NEARESTNEIGHBOR = 7; 
const INTERPOLATE_SPLINE = 8; 
Смежные вопросы