Изменение размера и обрезка изображения с помощью GD при сохранении пропорций

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

Это мой код:

if ($fileExtension == "jpg" || $fileExtension == "jpeg" || $fileExtension == "png" || $fileExtension == "gif"){ // GD variables: list($width, $height, $type) = GetImageSize($uploadedFile['tmp_name']); // Image sizes: $bigImage = array(800, 453); $mediumImage = array(410, 231); $listImage = array(120, 68); $thumbnail = array(90, 51); $sourceAspect = $width / $height; $bigAspect = $bigImage[0] / $bigImage[1]; $mediumAspect = $mediumImage[0] / $mediumImage[1]; $listAspect = $listImage[0] / $listImage[1]; $thumbnailAspect = $thumbnail[0] / $thumbnail[1]; // Image is PNG: if ($type == IMAGETYPE_PNG){ $image = imagecreatefrompng($uploadedFile['tmp_name']); $valid = true; } // Image is JPEG: else if ($type == IMAGETYPE_JPEG){ $image = imagecreatefromjpeg($uploadedFile['tmp_name']); $valid = true; } // Image is GIF: else if ($type == IMAGETYPE_GIF){ $image = imagecreatefromgif($uploadedFile['tmp_name']); $valid = true; } // Format not allowed: else { $valid = false; } // Start creating images: if ($valid){ // Get size: $imageSize = getimagesize($uploadedFile['tmp_name']); // Generate canvas: $bCanvas = imagecreatetruecolor($bigImage[0], $bigImage[1]); $mCanvas = imagecreatetruecolor($mediumImage[0], $mediumImage[1]); $lCanvas = imagecreatetruecolor($listImage[0], $listImage[1]); $tCanvas = imagecreatetruecolor($thumbnail[0], $thumbnail[1]); // Copy content: imagecopyresampled($bCanvas, $image, 0, 0, 0, 0, ($bigImage[0] * $sourceAspect), ($bigImage[1] / $sourceAspect), $imageSize[0], $imageSize[1]); imagecopyresampled($mCanvas, $image, 0, 0, 0, 0, $mediumImage[0], $mediumImage[1], $imageSize[0], $imageSize[1]); imagecopyresampled($lCanvas, $image, 0, 0, 0, 0, $listImage[0], $listImage[1], $imageSize[0], $imageSize[1]); imagecopyresampled($tCanvas, $image, 0, 0, 0, 0, $thumbnail[0], $thumbnail[1], $imageSize[0], $imageSize[1]); // Save images: $saveB = imagejpeg($bCanvas, $targetFile.'_big.jpg', 90); $saveM = imagejpeg($mCanvas, $targetFile.'_medium.jpg', 90); $saveT = imagejpeg($lCanvas, $targetFile.'_list.jpg', 90); $saveT = imagejpeg($tCanvas, $targetFile.'_thumb.jpg', 90); // Destroy images: imagedestroy($image); imagedestroy($bCanvas); imagedestroy($mCanvas); imagedestroy($lCanvas); imagedestroy($tCanvas); // Watermark images: $mark = imagecreatefrompng("logo.png"); list($mwidth, $mheight) = getimagesize("logo.png"); $img = imagecreatefromjpeg($targetFile.'_big.jpg'); list($bwidth, $bheight) = getimagesize($targetFile.'_big.jpg'); imagecopy($img, $mark, $bwidth-$mwidth-25, $bheight-$mheight-25, 0, 0, $mwidth, $mheight); imagejpeg($img, $targetFile.'_big.jpg', 100); imagedestroy($img); } else { echo "0"; } } else { move_uploaded_file($tempFile,$targetFile.'.'.$fileExtension); } 

Я был бы очень рад, если бы кто-то помог мне решить эту проблему. Я пробовал несколько методов, но ни один из них не работал должным образом. Как вы можете видеть наверху, я уже определил размеры холста, которые я хочу использовать в переменных «bigImage», «mediumImage», «listImage» и «thumbnail».

Заранее спасибо! // Джонатан

Related of "Изменение размера и обрезка изображения с помощью GD при сохранении пропорций"

Существует несколько способов изменения размера изображения. Я расскажу им о вас:

  • Растяжка для подгонки – размер изображения изменяется до желаемого размера, игнорируя соотношение сторон
  • Масштабирование в соответствии – размер изображения изменяется таким образом, чтобы один размер (ширина или высота) имел желаемый размер, в то время как другой был таким же или короче, сохраняя соотношение сторон (может потребоваться один дополнительный шаг, чтобы заполнить более короткую сторону сплошным цветом)
  • Обрезка по размеру – размер изображения изменяется таким образом, что один размер (ширина или высота) имеет желаемый размер, а другой тот же или более длинный, сохраняя соотношение сторон (один дополнительный шаг необходим для обрезки внешней области)

PS: обе статьи были написаны мной.