Добавление кадрирования в PHP-скрипт изменения размера изображения

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

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

Может ли кто-нибудь помочь?

Спасибо как всегда.

mkdir("images/$user_id");
$saveto = "images/$user_id/$user_id.jpg";
move_uploaded_file($_FILES['image']['tmp_name'], $saveto);
$typeok = TRUE;

switch($_FILES['image']['type'])
{
    case "image/gif":   $src = imagecreatefromgif($saveto); break;

    case "image/jpeg":  // Both regular and progressive jpegs
    case "image/pjpeg": $src = imagecreatefromjpeg($saveto); break;

    case "image/png":   $src = imagecreatefrompng($saveto); break;

    default:            $typeok = FALSE; break;
}

if ($typeok)
{




    list($w, $h) = getimagesize($saveto);
    $max = 200;
    $tw  = $w;
    $th  = $h;

    if ($w > $h && $max < $w)
    {
        $th = $max / $w * $h;
        $tw = $max;
    }
    elseif ($h > $w && $max < $h)
    {
        $tw = $max / $h * $w;
        $th = $max;
    }
    elseif ($max < $w)
    {
        $tw = $th = $max;
    }

    $tmp = imagecreatetruecolor($tw, $th);
    imagecopyresampled($tmp, $src, 0, 0, 0, 0, $tw, $th, $w, $h);
    imageconvolution($tmp, array( // Sharpen image
                            array(-1, -1, -1),
                            array(-1, 16, -1),
                            array(-1, -1, -1)
                           ), 8, 0);
    imagejpeg($tmp, $saveto);
    imagedestroy($tmp);
    imagedestroy($src);


}

РЕДАКТИРОВАТЬ: я нашел следующий скрипт, который отлично работает, когда он находится на своей собственной странице, однако у меня возникли проблемы с его реализацией либо в существующий скрипт загрузки, либо после него - я получаю несколько «не удалось открыть поток: нет такого файла или каталога». ' ошибки - однако путь к изображению правильный (я повторил его, чтобы быть уверенным):

$filename = 'images/$user_id/$user_id.jpg';

// Get dimensions of the original image
list($current_width, $current_height) = getimagesize($filename);

// The x and y coordinates on the original image where we
// will begin cropping the image
$left = 25;
$top = 25;

// This will be the final size of the image (e.g. how many pixels
// left and down we will be going)
$crop_width = 200;
$crop_height = 200;

// Resample the image
$canvas = imagecreatetruecolor($crop_width, $crop_height);
$current_image = imagecreatefromjpeg($filename);
imagecopy($canvas, $current_image, 0, 0, $left, $top, $current_width, $current_height);
imagejpeg($canvas, $filename, 100);

Может ли кто-нибудь помочь мне собрать их вместе?

Спасибо


person Dan    schedule 16.09.2012    source источник
comment
Это слишком локализовано. Ответ, как добавить кадрирование в свой конкретный скрипт, не поможет никому, кроме вас самих. Существуют сотни, если не тысячи примеров обрезки изображений с помощью PHP, вы должны попробовать добавить это в свой скрипт и обратиться за помощью, если столкнетесь с ошибкой.   -  person meagar    schedule 16.09.2012
comment
imagick::cropThumbnailImage сделает всю работу за вас.   -  person Tchoupi    schedule 16.09.2012
comment
@meagar Справедливое замечание :) Я попробую что-нибудь и отчитаюсь. Спасибо   -  person Dan    schedule 16.09.2012


Ответы (2)


Взгляните на: Gregwar/Image

Он очень прост в использовании и очень эффективен.

  • resize($width, $height, $background): изменяет размер изображения, сохраняет масштаб и никогда не увеличивает его.

  • scaleResize($width, $height, $background): изменяет размер изображения, сохраняя масштаб

  • forceResize($width, $height, $background): изменяет размер изображения, заставит изображение быть ровно $ширина на $высоту

  • cropResize($width, $height, $background): изменяет размер изображения с сохранением масштаба и обрезкой пробелов.

person Jérôme Boé    schedule 16.09.2012

Спасибо всем за ответы - мой скрипт заработал, изменив

$filename = 'images/$user_id/$user_id.jpg';

to

$filename = "images/$user_id/$user_id.jpg";
person Dan    schedule 16.09.2012
comment
Если вы этого не видите. Он изменил кавычки! - person JochemQuery; 16.09.2012