Вы можете изменить размер загруженных файлов пользователя, чтобы сэкономить место на вашем сервере.
Есть много способов изменить размер изображения и уменьшить его качество, и, возможно, будет лучше, если вы создадите свою собственную функцию, так как она может лучше соответствовать вашим потребностям.
В этом случае мы покажем вам способ изменить размер ваших изображений и снизить качество с помощью простого PHP без использования библиотеки Imagick.
Изменить размер изображения и вернуть необработанные данные
Чтобы изменить размер изображения из файла, используйте следующий метод. Он поддерживает форматы png, jpg и gif, вы можете расширить поддерживаемые методы, изменяя оператор switch в функции.
/**
* Resize image given a height and width and return raw image data.
*
* Note : You can add more supported image formats adding more parameters to the switch statement.
*
* @param type $file filepath
* @param type $w width in px
* @param type $h height in px
* @param type $crop Crop or not
* @return type
*/
function resize_image($file, $w, $h, $crop=false) {
list($width, $height) = getimagesize($file);
$r = $width / $height;
if ($crop) {
if ($width > $height) {
$width = ceil($width-($width*abs($r-$w/$h)));
} else {
$height = ceil($height-($height*abs($r-$w/$h)));
}
$newwidth = $w;
$newheight = $h;
} else {
if ($w/$h > $r) {
$newwidth = $h*$r;
$newheight = $h;
} else {
$newheight = $w/$r;
$newwidth = $w;
}
}
//Get file extension
$exploding = explode(".",$file);
$ext = end($exploding);
switch($ext){
case "png":
$src = imagecreatefrompng($file);
break;
case "jpeg":
case "jpg":
$src = imagecreatefromjpeg($file);
break;
case "gif":
$src = imagecreatefromgif($file);
break;
default:
$src = imagecreatefromjpeg($file);
break;
}
$dst = imagecreatetruecolor($newwidth, $newheight);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
return $dst;
}
Предыдущий метод возвращает в переменную необработанные данные из изображения, поэтому вам необходимо сохранить их вручную в соответствии с типом файла, т.е.
$filename = "/var/www/images/mynormalimage.png";
$resizedFilename = "/var/www/images/myresizedimage.png";
// resize the image with 300x300
$imgData = resize_image($filename, 300, 300);
// save the image on the given filename
imagepng($imgData, $resizedFilename);
// or according to the original format, use another method
// imagejpeg($imgData, $resizedFilename);
// imagegif($imgData, $resizedFilename);
Действительно прямолинейное решение для быстрого изменения размера обычного изображения, но обратите внимание, что рекомендуется использовать логику предыдущей функции и реализовать новую, соответствующую вашим потребностям.
Уменьшить или повысить качество
Обратите внимание, что с imagejpeg, imagepng и т. д. методами можно указать качество изображения в третьем параметре с помощью числового значения (INT):
// Get the data from a png file
$imageData = resize_image("myfolder/myfile.png",500,500);
// Give a name to your file with the full patj
$filepath = "myfolder/myresizedimage.png";
$quality = 0;
imagepng($imageData,$filepath,$quality);
Каждый метод сохранения поддерживает третий параметр, который определяет качество изображения. Это значение устанавливает уровень сжатия: 0-9 или -1, где 0 вообще НЕ СЖАТИЕ, 1 — БЫСТРЫЙ, но создает файлы большего размера, 9 — лучшее сжатие (наименьшие файлы), но сжатие занимает много времени, и -1 выбирает значение по умолчанию, скомпилированное в библиотеку zlib.
Вы даже можете создать метод сжатия, например, следующий:
/**
* Decrease or increase the quality of an image without resize it.
*
* @param type $source
* @param type $destination
* @param type $quality
* @return type
*/
function compress($source, $destination, $quality) {
//Get file extension
$exploding = explode(".",$source);
$ext = end($exploding);
switch($ext){
case "png":
$src = imagecreatefrompng($source);
break;
case "jpeg":
case "jpg":
$src = imagecreatefromjpeg($source);
break;
case "gif":
$src = imagecreatefromgif($source);
break;
default:
$src = imagecreatefromjpeg($source);
break;
}
switch($ext){
case "png":
imagepng($src, $destination, $quality);
break;
case "jpeg":
case "jpg":
imagejpeg($src, $destination, $quality);
break;
case "gif":
imagegif($src, $destination, $quality);
break;
default:
imagejpeg($src, $destination, $quality);
break;
}
return $destination;
}
Он ожидает путь к файлу файла, который необходимо изменить. Второй параметр — путь назначения файла, он может совпадать с первым параметром для его замены.
Информация
Помните, что существует много поддерживаемых типов изображений для обработки, PHP поддерживает следующие методы:
- imagecreatefromgd.
- imagecreatefromgd2.
- imagecreatefromgd2part.
- imagecreatefromgif.
- imagecreatefromjpeg.
- imagecreatefrompng.
- imagecreatefromstring.
- imagecreatefromwbmp.
- imagecreatefromwebp.
- imagecreatefromxbm.
- imagecreatefromxpm.
А для создания изображения из предыдущих методов используйте:
- imagegd.
- imagegd2.
- imagegd2part.
- imagecreatefromgif.
- imagejpeg.
- imagepng.
- imagestring.
- imagewbmp.
- imagewebp.
- imagexbm.
- imagexpm.
И соответственно сохраните методы с префиксом image(imagefrom,filepath), Повеселись