Загрузка и уменьшение размеров изображений на PHP и GD

Если у Вас есть свой сайт, на котором пользователи могут загружать свои изображения, Вы должны знать, что даже небольшие изображения (примерно 100 на 100 пикселей размером) могут занимать до 100 КБ. Это много, если учесть, что большинство изображений с таким разрешением занимают до 10 КБ. Накладные расходы в более 90% не есть хорошо, особенно, если таких изображений десятки и сотни тысяч.

Для начала сделаем форму для загрузки изображений:

<form action="upload.php" method="POST" enctype="multipart/form-data">
Выберите изображение для загрузки: <input name="image" type="file" /><br />
<input type="submit" value="Загрузить изображение" />
</form>

Это стандартная форма для загрузки каких либо файлов на сервер. С полем для указания файла и кнопкой отправить.
После того как изображение загружено на сервер, необходимо подвергнуть его ряду проверок. Среди них:
было ли что-либо загружено или пользователь отправил пустую форму;
было ли загружено изображение;
было ли загружено изображение подходящего типа;
не слишком ли большое изображение.

Реализуем эти проверки в файле upload.php:

<?php 
if(isset($_FILES['image'])){
   if($_FILES['image']['size'] < 1){
      echo 'Ошибка загрузки!';
   }
   else if($_FILES['theimage']['size'] > 100000){
      echo 'Слишком большой файл!';
   }
   else {
      switch($_FILES['image']['type']){
         case 'image/gif':
         $image = imagecreatefromgif($_FILES['image']['tmp_name']);
         break;
         case 'image/jpeg':
         case 'image/pjpeg':
         $image = imagecreatefromjpeg($_FILES['image']['tmp_name']);
         break;
         case 'image/png':
         $image = imagecreatefrompng($_FILES['image']['tmp_name']);
         break;
      }
      if(!isset($image)){
         echo 'Неверный формат изображения. Допустимы только .gif, .jpg или .png!';
      }else{
         // тут будет обработка и сохранение изображения
      }
   }
}
else {
   echo 'Это не изображение!';
}

Чтобы уменьшить размер изображений, будем конвертировать их в jpg. Однако, этот формат не поддерживает прозрачность, поэтому следует позаботиться об этом при конфертации — прозрачная область зальется черным цветом. Чтобы обойти эту проблему, нужно сначала создать изображение тех же размеров, что и загруженное, но залитое полностью белым цветом, а затем наложить сверху загруженное изображение:

         $size = getimagesize($_FILES['image']['tmp_name']);
         $background = imagecreatetruecolor($size[0],$size[1]);
         $white = imagecolorallocate($background,255,255,255);
         imagefill($background,0,0,$white);
         imagecopy($background,$image,0,0,0,0,$size[0],$size[1]);

Осталось дело за малым — сохранить полученное изображение и вывести пользователю сообщение об успешной загрузке:

         $filename = explode(".",$_FILES['image']['name']);
         $image = $background;
         $filename = explode(".",$_FILES['image']['name']);
         $filename = $filename[0];
         imagejpeg($image,$_SERVER['DOCUMENT_ROOT'] . '/thumbnails/' . $filename . '.jpg',90);
         imagedestroy($image);
         echo 'Загруженное изображение: <img src="/thumbnails/' . $filename . '.jpg" />';

Изображение загружено и уменьшено в размерах. Можно не беспокоиться за место на сервере :)

Запись опубликована в рубрике PHP & MySQL с метками . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">