Как изменить размер изображения и снизить качество в PHP без Imagick

Вы можете изменить размер загруженных файлов пользователя, чтобы сэкономить место на вашем сервере.

Есть много способов изменить размер изображения и уменьшить его качество, и, возможно, будет лучше, если вы создадите свою собственную функцию, так как она может лучше соответствовать вашим потребностям.

В этом случае мы покажем вам способ изменить размер ваших изображений и снизить качество с помощью простого 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), Повеселись

Ссылка на основную публикацию