PHP изменяет размер изображения пропорционально большему размеру

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

Вот в чем проблема: если он обнаруживает, что изображение не может быть показано в двойном размере, увеличьте размер обрезанного до тех пор, пока он не достигнет пределов исходного размера, и я не могу найти способ его масштабирования правильно. (Моя главная проблема в том, что я не очень хорош в математике: P).

Для более простой лекции:

  • Оригинальный размер изображения: 600 x 301
  • Это необходимый / обрезанный размер: 320 x 180
  • Это размер, который я хочу получить: 535 x 301 . Я получил его из Photoshop, и это результат масштабирования 320×180 до тех пор, пока он не найдет предел исходного размера.

PS: Я знаю GD, поэтому мне нужна только формула для расчета размера.

Solutions Collecting From Web of "PHP изменяет размер изображения пропорционально большему размеру"

Тот же алгоритм, который масштабируется, также может увеличиваться. Это непроверенный код, и он предназначен только для уменьшения масштаба, но если вы удалите тесты «уменьшить масштаб», это может сделать трюк для вас.

<?php // RAY_image_resize_and_crop.php error_reporting(E_ALL); // RESIZE AN IMAGE PROPORTIONALLY AND CROP TO THE CENTER function resize_and_crop($original_image_url, $thumb_image_url, $thumb_w, $thumb_h, $quality=75) { // ACQUIRE THE ORIGINAL IMAGE: http://php.net/manual/en/function.imagecreatefromjpeg.php $original = imagecreatefromjpeg($original_image_url); if (!$original) return FALSE; // GET ORIGINAL IMAGE DIMENSIONS list($original_w, $original_h) = getimagesize($original_image_url); // RESIZE IMAGE AND PRESERVE PROPORTIONS $thumb_w_resize = $thumb_w; $thumb_h_resize = $thumb_h; if ($original_w > $original_h) { $thumb_h_ratio = $thumb_h / $original_h; $thumb_w_resize = (int)round($original_w * $thumb_h_ratio); } else { $thumb_w_ratio = $thumb_w / $original_w; $thumb_h_resize = (int)round($original_h * $thumb_w_ratio); } if ($thumb_w_resize < $thumb_w) { $thumb_h_ratio = $thumb_w / $thumb_w_resize; $thumb_h_resize = (int)round($thumb_h * $thumb_h_ratio); $thumb_w_resize = $thumb_w; } // CREATE THE PROPORTIONAL IMAGE RESOURCE $thumb = imagecreatetruecolor($thumb_w_resize, $thumb_h_resize); if (!imagecopyresampled($thumb, $original, 0,0,0,0, $thumb_w_resize, $thumb_h_resize, $original_w, $original_h)) return FALSE; // ACTIVATE THIS TO STORE THE INTERMEDIATE IMAGE // imagejpeg($thumb, 'RAY_temp_' . $thumb_w_resize . 'x' . $thumb_h_resize . '.jpg', 100); // CREATE THE CENTERED CROPPED IMAGE TO THE SPECIFIED DIMENSIONS $final = imagecreatetruecolor($thumb_w, $thumb_h); $thumb_w_offset = 0; $thumb_h_offset = 0; if ($thumb_w < $thumb_w_resize) { $thumb_w_offset = (int)round(($thumb_w_resize - $thumb_w) / 2); } else { $thumb_h_offset = (int)round(($thumb_h_resize - $thumb_h) / 2); } if (!imagecopy($final, $thumb, 0,0, $thumb_w_offset, $thumb_h_offset, $thumb_w_resize, $thumb_h_resize)) return FALSE; // STORE THE FINAL IMAGE - WILL OVERWRITE $thumb_image_url if (!imagejpeg($final, $thumb_image_url, $quality)) return FALSE; return TRUE; } // USE CASE echo '<a target="_blank" href="RAY_orig_600x374.jpg">Original 600x374</a><br/>'; resize_and_crop('RAY_orig_600x374.jpg', 'RAY_temp_100x100.jpg', 100, 100); echo '<a target="_blank" href="RAY_temp_100x100.jpg">100x100</a><br/>'; resize_and_crop('RAY_orig_600x374.jpg', 'RAY_temp_200x100.jpg', 200, 100); echo '<a target="_blank" href="RAY_temp_200x100.jpg">200x100</a><br/>'; resize_and_crop('RAY_orig_600x374.jpg', 'RAY_temp_200x300.jpg', 200, 300); echo '<a target="_blank" href="RAY_temp_200x300.jpg">200x300</a><br/>'; 

(Отправлено от имени ОП):

Благодаря Ray Paseur я получил эту функцию:

 function getAppropriateDimensionsForRetina($originalWidth,$originalHeight,$width,$height){ $newWidth = $originalWidth; $newHeigth = $originalHeight; if($originalWidth > $originalHeight){ $heightRatio = $originalHeight / $height; $newWidth = (int)floor($width * $heightRatio); }else{ $widthRatio = $originalWidth / $width; $newHeigth = (int)floor($height * $widthRatio); } return array('width' => $newWidth,'height' => $newHeigth); }