#php #gd #crop #image-resizing
#php #gd #обрезать #изменение размера изображения
Вопрос:
Я хочу уменьшить размер изображения с 600px * 500px до 60px * 50px, затем обрезать его до 50px * 50px. У меня есть две группы кодов, 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
?>
Как вы можете видеть из 2 групп кодов выше, 1-я группа изменяет размер изображения, затем сохраняет его в папку. 2-я группа кодов обрезает изображение, затем также сохраняет его в папке. Мой вопрос… После того, как 1-я группа кодов изменит размер изображения, необходимо ли сохранить его в папку, прежде чем я смогу его обрезать? Если это необходимо, то мне нужно написать новые строки кодов для извлечения измененного изображения из папки для 2-й группы кодов, чтобы обрезать его? Если в этом нет необходимости, после изменения размера рисунка, как мне передать рисунок во 2-ю группу кодов, чтобы обрезать его?
Комментарии:
1. И где вы изменяете размер изображения? Можете ли вы упомянуть строку?
2. привет, я обновил свой вопрос, добавив коды изменения размера изображения. Пожалуйста, взгляните. Спасибо.
3. Позвольте мне уточнить: у вас есть изображение с разрешением, например, 900×600, и вы хотите изменить размер изображения так, чтобы меньшая сторона была равна 50 (в этом случае измените размер изображения на 75×50), а затем обрезайте его до 50×50. Не так ли?
4. @Arman P, да, ты прав.
5. Используйте этот класс: github.com/qaribhaider/php-image-resize , 1 — измените размер изображения на точную ширину по высоте 2 — измените размер с помощью метода обрезки
Ответ №1:
Вот ты где @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);
?>
Комментарии:
1. @zac1987 Добро пожаловать, тем временем, чтобы обрезать с других координат (не слева: 0, сверху: 0) — просто отредактируйте 3-й и 4-й нули в
imagecopyresampled
.2. да, я назначил координацию вашему коду. if($src_width > $ src_height){ $top = 0; $ left = 70;}elseif ($src_width < $src_height) {$ top = 70; $ left = 0;} Еще раз спасибо за вашу помощь.
Ответ №2:
$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×500 пикселей, и вы хотите изменить размер и обрезать до 50×50, вам следует установить значение $ top равным 0, а $ left — 50 (px). Оба параметра $modwidth и $ modheight должны быть установлены на 500. Это сохраняет полную высоту исходного изображения и сокращает 50 пикселей с левой стороны и 50 пикселей с правой стороны. Оставшиеся 500 пикселей обрезаются до 50 пикселей.
Комментарии:
1. исходный размер изображения не исправлен, возможно, это 800px * 1200px, поэтому ваша концепция об урезании 50px с обеих сторон для этого не сработает. Кроме того, если я сделаю так, как вы сказали, например, «$ modwidth и $ modheight должны быть установлены на 500», тогда изображение будет выглядеть растянутым, поскольку исходное изображение имеет размер 500 пикселей * 600 пикселей.
2. Верно, код неполон, и вы, вероятно, обнаружите ошибки в вычислениях. Я не тестировал код. Текст под кодом, однако, должен дать вам много информации о том, как решить проблему.
Ответ №3:
ссылка на статью в блоге, которую я написал о том, как изменить размер изображения любого размера до любого произвольного размера. включает опции для почтового ящика и обрезки по размеру.