php изменить размер изображения, а затем обрезать изображение

Я хочу уменьшить размер изображения с 600 пикселей * 500 пикселей до размера 60 пикселей * 50 пикселей, а затем обрезать его до 50 пикселей * 50 пикселей. У меня есть две группы кодов: 1 — уменьшить размер изображения, 1 — обрезать изображение. Проблема в том, что они работают по отдельности, как объединить эти две группы кодов, чтобы они работали вместе? Ниже мои коды:

<?php

//codes of group A - Reduce the size of image from 600px * 500px to 60px * 50px   
    $save2 = "images/users/" . $image_name_2; //This is the new file you saving
    list($width2, $height2) = getimagesize($file) ; 
    $modwidth2 = 50; 
    $diff2 = $width2 / $modwidth2;
    $modheight2 = $height2 / $diff2; 
    $tn2 = imagecreatetruecolor($modwidth2, $modheight2) ; 
    $image2 = imagecreatefromjpeg($file) ; 
    imagecopyresampled($tn2, $image2, 0, 0, 0, 0, $modwidth2, $modheight2, $width2, $height2) ; 
    imagejpeg($tn2, $save2, 100) ; 



//codes of group B - Crop the image from 60px * 50px to 50px * 50px 
    $save3 = "images/users/" . $image_name_3;  
    list($width3, $height3) = getimagesize($file) ; 
    $modwidth3 = 60;  
    $diff3 = $width3 / $modwidth3;
    $modheight3 = $height3 / $diff3; 

    $left = 0; 
    $top = 0;

    $cropwidth = 50; //thumb size
    $cropheight = 50;

    $tn3 = imagecreatetruecolor($cropwidth, $cropheight) ; 
    $image3 = imagecreatefromjpeg($file) ; 
    imagecopyresampled($tn3, $image3, 0, 0, $left, $top, $cropwidth, $cropheight, $modwidth3, $modheight3) ; 
    imagejpeg($tn3, $save3, 100) ; //save the cropped image
?>

Как вы можете видеть из двух групп кодов выше, 1-я группа изменяет размер изображения, а затем сохраняет его в папку. 2-я группа кодов обрезает картинку и тоже сохраняет в папку. Мой вопрос: после того, как 1-я группа кодов изменяет размер изображения, необходимо ли сохранять его в папку, прежде чем я смогу его обрезать? Если это необходимо, то мне нужно написать новые строки кодов, чтобы получить изображение с измененным размером из папки для 2-й группы кодов, чтобы обрезать его? Если в этом нет необходимости, после изменения размера изображения, как мне передать изображение во 2-ю группу кодов, чтобы обрезать его?


person zac1987    schedule 09.05.2011    source источник
comment
А где изменить размер картинки? Вы можете упомянуть линию?   -  person Arman P.    schedule 10.05.2011
comment
привет, я обновил свой вопрос, добавив коды изменения размера изображения. Пожалуйста, посмотрите. Спасибо.   -  person zac1987    schedule 10.05.2011
comment
Позвольте мне уточнить: у вас есть изображение с разрешением, например. 900x600, и вы хотите изменить размер изображения, чтобы меньшая сторона была равна 50 (в этом случае измените размер изображения до 75x50), а затем обрежьте его до 50x50. Не так ли?   -  person Arman P.    schedule 10.05.2011
comment
@ Арман П, да, ты прав.   -  person zac1987    schedule 10.05.2011
comment
Используйте этот класс: github.com/qaribhaider/php-image-resize, 1- изменить размер изображения до точной ширины и высоты 2- изменить размер, используя метод обрезки   -  person Syed Qarib    schedule 20.03.2014


Ответы (3)


Вот вы, @zac1987.
Полный PHP код, создающий квадратную миниатюру нужного размера без растягивания изображения. Код поддерживает расширения изображений png и jpg/jpeg. Просто измените часть настроек на нужную. Вы можете скопировать код и протестировать его на своем веб-сервере.

<?php

    // SETTINGS
    $image_name = 'file.jpg';    // Full path and image name with extension
    $thumb_name = 'thumbnail';   // Generated thumbnail name without extension
    $thumb_side = 100;           // Desired thumbnail side size
    // END OF SETTINGS

    $image_extension = explode('.', $image_name); // I assume that images are named only following 'imagename.ext' pattern

    if (preg_match('/jpg|jpeg/', $image_extension[1])) {
        $src_image = imagecreatefromjpeg($image_name);
        $image_extension = 'jpg';
    } else if (preg_match('/png/', $image_extension[1])) {
        $src_image = imagecreatefrompng($image_name);
        $image_extension = 'png';
    }

    $src_width = imageSX($src_image);   // Width of the original image
    $src_height = imageSY($src_image);  // Height of the original image

    $min_side = min($src_width, $src_height);

    /*********** If you need this part uncomment it
    $ratio = $min_side / $thumb_width;
    $new_width = floor($src_width / $ratio);
    $new_height = floor($src_height / $ratio);
    **********************************************/    

    $dst_image = imagecreatetruecolor($thumb_side, $thumb_side);

    imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $thumb_side, $thumb_side, $min_side, $min_side);

    switch ($image_extension)
    {
        case 'jpg':
            imagejpeg($dst_image, $thumb_name . '.jpg', 100);
            break;
        case 'png':
            imagepng($dst_image, $thumb_name . '.jpg', 100);
            break;
    }

    imagedestroy($src_image);
    imagedestroy($dst_image);

?>
person Arman P.    schedule 10.05.2011
comment
@ zac1987 zac1987 Тем временем вы можете обрезать другие координаты (не слева: 0, сверху: 0) - просто отредактируйте 3-й и 4-й нули в imagecopyresampled. - person Arman P.; 11.05.2011
comment
да, я назначил координацию на ваш код. if($src_width › $src_height){ $top=0; $left=70;}elseif ($src_width ‹ $src_height){$top=70; $left=0;} Еще раз спасибо за помощь. - person zac1987; 11.05.2011

$modwidth3 = 500;  //I resize the picture width to smaller as 60px.
$diff3 = $width3 / $modwidth3;
$modheight3 = $height3 / $diff3;  //I resize the picture height to smaller.

$left = 1; //getting the left and top coordinate
$top = 1;

$cropwidth = 50; //thumb size
$cropheight = 50;

imagecopyresampled($tn3, $image3, 0, 0, $left, $top, $cropwidth, $cropheight, $modwidth3, $modheight3) ; 

$modwidth3 и $modheight3 должны соответствовать ширине и высоте изображения, которое вы хотите обрезать. Также $top и $left должны соответствовать верхней левой координате области, которую вы хотите обрезать. Если исходное изображение имеет размер 600 x 500 пикс. и вы хотите изменить его размер и обрезать до размера 50 x 50, установите для $top значение 0, а для параметра $left значение 50 (пкс). И $modwidth, и $modheight должны быть установлены на 500. Это сохраняет полную высоту исходного изображения и обрезает 50 пикселей с левой стороны и 50 пикселей с правой стороны. Оставшиеся 500 пикселей обрезаются до 50 пикселей.

person Arjan    schedule 09.05.2011
comment
исходный размер изображения не фиксирован, может быть, это 800 пикселей * 1200 пикселей, поэтому ваша концепция обрезания 50 пикселей с обеих сторон для этого не подойдет. Кроме того, если я сделаю то, что вы сказали, например, $modwidth и $modheight должны быть установлены на 500, тогда изображение будет выглядеть растянутым, поскольку исходное изображение составляет 500 пикселей * 600 пикселей. - person zac1987; 10.05.2011
comment
Правда, код неполный и вы наверняка найдете ошибки в расчетах. Я не тестировал код. Однако текст под кодом должен дать вам много информации о том, как решить проблему. - person Arjan; 10.05.2011

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

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

person dqhendricks    schedule 09.05.2011