В качестве краткого прогона я сейчас создаю сайт типа знакомств. Пользователи могут создавать учетные записи и загружать фотографии профиля (до 8). Чтобы отобразить их в области просмотра веб-сайта, я ищу способ на PHP (с сторонним процессором / скриптами), чтобы изменить размер всех загруженных изображений, чтобы иметь миниатюры, которые придерживаются определенных размеров.
В качестве примера я хочу, чтобы изображения «профиля» (миниатюры) были NO больше 120 * 150 пикселей. Сценарии должны изменять размер загруженных изображений (независимо от того, являются ли они портретными или ландшафтными и независимо от пропорций), чтобы придерживаться этих измерений, не растягиваясь.
Ширина (например, 120 пикселей) должна всегда оставаться неизменной, но высота (например, 150 пикселей) может варьироваться, чтобы поддерживать изображение пропорционально. Если это пейзажная фотография, я предполагаю, что сценарий должен будет вынуть кусок из середины изображения?
Причина, по которой все изображения должны быть изменены, заключается в том, что когда профили отображаются в сетке, все миниатюры имеют примерно одинаковый размер.
Любой вход был бы весьма признателен.
$maxwidth = 120; $maxheight = 150; $img = imagecreatefromjpeg($jpgimage); //or imagecreatefrompng,imagecreatefromgif,etc. depending on user's uploaded file extension $width = imagesx($img); //get width and height of original image $height = imagesy($img); //determine which side is the longest to use in calculating length of the shorter side, since the longest will be the max size for whichever side is longest. if ($height > $width) { $ratio = $maxheight / $height; $newheight = $maxheight; $newwidth = $width * $ratio; } else { $ratio = $maxwidth / $width; $newwidth = $maxwidth; $newheight = $height * $ratio; } //create new image resource to hold the resized image $newimg = imagecreatetruecolor($newwidth,$newheight); $palsize = ImageColorsTotal($img); //Get palette size for original image for ($i = 0; $i < $palsize; $i++) //Assign color palette to new image { $colors = ImageColorsForIndex($img, $i); ImageColorAllocate($newimg, $colors['red'], $colors['green'], $colors['blue']); } //copy original image into new image at new size. imagecopyresized($newimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagejpeg($newimg,$outputfile); //$output file is the path/filename where you wish to save the file. //Have to figure that one out yourself using whatever rules you want. Can use imagegif() or imagepng() or whatever.
Это уменьшит количество изображений пропорционально, исходя из того, какая сторона больше (ширина или высота), до максимального размера. Он также взорвет любые изображения, меньшие, чем макс, которые вы можете остановить с небольшой проверкой на то, будут ли ширина и высота меньше их максимальной. Таким образом, изображение размером 200×300 будет уменьшено до 100×150, а изображение размером 300×200 будет уменьшено до 120×80.
Хм, вы хотите, чтобы ширина всегда составляла 120, поэтому она немного изменилась, и да, ей пришлось бы что-то вырезать в случае с изображением типа 200×300, потому что это уменьшилось бы до 120×180 без каких-либо искажений, придется сжимать его дальше и почтовый ящик, но это должно заставить вас начать хорошо.
Letterboxing этого примера будет просто включать выяснение того, какие правильные x и y, чтобы начать рисование на новом изображении, были бы в функции imagecopyresized (). В случае чего-то вроде 100×150, я думаю, будет 10, поэтому в конце будет 10px свободного места на каждой стороне для 120×150. Letterboxing 120×80 X будет 0, но Y будет 35, поэтому для 120×150 будет 35px свободного пространства сверху и снизу.
Вы также хотите сделать $ newimg с $ maxwidth, $ maxheight, а не $ newwidth, $ newheight, но imagecopyresized () все равно будет использовать оба новых значения.
Поскольку мне скучно и больше нечего делать, эти изменения сделают это:
if ($height > $width) { $ratio = $maxheight / $height; $newheight = $maxheight; $newwidth = $width * $ratio; $writex = round(($maxwidth - $newwidth) / 2); $writey = 0; { else { $ratio = $maxwidth / $width; $newwidth = $maxwidth; $newheight = $height * $ratio; $writex = 0; $writey = round(($maxheight - $newheight) / 2); } $newimg = imagecreatetruecolor($maxwidth,$maxheight); //Since you probably will want to set a color for the letter box do this //Assign a color for the letterbox to the new image, //since this is the first call, for imagecolorallocate, it will set the background color //in this case, black rgb(0,0,0) imagecolorallocate($newimg,0,0,0); //Loop Palette assignment stuff here imagecopyresized($newimg, $img, $writex, $writey, 0, 0, $newwidth, $newheight, $width, $height);
Это должно работать, еще не пробовал.
Функции GD или Imagick – это то, что вам нужно, в зависимости от вашей конфигурации PHP.
Извините, что я новичок, я не могу опубликовать обе ссылки в одном сообщении 🙁
Я недавно нуждался в решении для изменения размера (уменьшенного размера) и нашел библиотеку Zebra_Image , которая представляет собой небольшую библиотеку манипулирования изображениями, написанную на PHP. Код действительно чист, и он также прост в использовании. Я настоятельно рекомендую использовать эту библиотеку. Пример кода достаточно, чтобы вы начали.
Убедитесь, что в файле php.ini установлено достаточное количество памяти, чтобы управлять изображениями с относительно большим разрешением (например, 2560×1600). У меня была ошибка с большими изображениями, и для печати не было ошибок. Я отлаживал проблему до imagecreatefrom{gif,jpeg,png}
вызовов imagecreatefrom{gif,jpeg,png}
в function _create_from_source
в строках 1262 , 1279 и 1288 . Вызовы были беззвучными с @, поэтому у меня не было изменений, чтобы получить ошибку. Я удалил @ строки и увидел ошибку PHP, предел памяти превышен. Исходный предел памяти был установлен на 32 МБ, и я увеличил его до 64 МБ. Теперь я могу манипулировать 2560×1600, и я отказываюсь манипулировать изображениями, которые больше.
Ниже приведен пример кода для управления разрешением изображения.
$image_properties = getimagesize($UPLOADED_FILE_PATH); $file_width = $image_properties[0]; $file_height = $image_properties[1]; if ($file_width > 2560 || $file_height > 1600) { // handle your error whichever you like, I simply 'die' just to show die('Cannot manipulate image bigger than 2560x1600'); }
(Примечание: я использую версию Zebra Image 2.2.2)
Вы можете сделать это с помощью ImageMagick :
convert susan.jpg -resize x200 susan_thumb.jpg
Это выполняется с помощью команды оболочки, поэтому в PHP вы должны использовать shell_exec()
для выполнения указанной выше команды. Я не думаю, что вам нужны расширения PHP.
Несколько флагов можно найти в документации ImageMagick, чтобы контролировать операцию изменения размера. Если я правильно помню, x200
перед номером означает «масштаб с тем же соотношением сторон к 200px».
Я написал руководство по установке для ImageMagick (и ghostscript): как установить, протестировать, конвертировать, изменить размер PDF с помощью ImageMagick, Ghostscript, Windows Vista / 7 x64 на основе моего неуклюжа, возможно, это может вам помочь.
Другой вариант – это библиотека GD (подробно в ответе dqhendricks). Это быстрее и, по-видимому, лучше документировано, используется для основных операций.
вам не нужно воображать. вот ссылка, которая приведет вас к функции, которая будет изменять размер любого изображения с помощью PHP GD до любого произвольного размера. функция имеет опции для использования методов letterboxing или crop-to-fit для изменения размера к новому соотношению сторон. функция также подробно объясняется. проверьте это.
http://www.spotlesswebdesign.com/blog.php?id=1
если это то, что вы ищете, установите флажок рядом с этим ответом. благодаря!