аватар Автор: Сергей Касаткин | 12 марта 2015 12:13

Статьи / PHP /

Как в PHP загрузить на сайт изображение с изменением веса и размера?

Скорее всего Вы уже сталкивались с потребностью в том, чтобы не просто ограничить пользователя в размерах загружаемых на Ваш сайт изображений. Правильно, можно загружаемое пользователем изображение скопировать, уменьшить или подогнать под нужный размер. Или может вырезать квадратное изображение, как делают в социальных сетях? Смотрим примеры.



В указанных ниже примерах только ОБРАБОТКА изображений, а не вся форма загрузки) Про загрузку можно почитать здесь.


Загрузка и сжатие изображения в PHP


В первом примере определяем максимальные размеры нового изображения, создаём новое по новым пропорционально меньшим размерам, удаляем исходник.

<?php 
// ПРИМЕР ФАЙЛА. 
$filename = 'test.jpg'; 

// ПРОВЕРКА НА ИЗОБРАЖЕНИЕ
$size = getimagesize($filename); // если это изображение и у него определён размер, то продолжаем
if ($size){

// ОПРЕДЕЛЯЕМ МАКСИМАЛЬНЫЕ ШИРИНУ И ВЫСОТУ ИЗОБРАЖЕНИЯ
$width = 200; 
$height = 200; 

// РАБОТАЕМ КОРРЕКТНО. ОПРЕДЕЛЯЕМ ТИП
header("Content-type: {$size['mime']}");

// ПОЛУЧАЕМ НОВЫЕ РАЗМЕРЫ
list($width_orig, $height_orig) = getimagesize($filename); 

if ($width && ($width_orig < $height_orig)) { 
    $width = ($height / $height_orig) * $width_orig; 
} else { 
    $height = ($width / $width_orig) * $height_orig; 

// ПЕРЕСОХРАНЯЕМ ИЗОБРАЖЕНИЕ
$image_p = imagecreatetruecolor($width, $height); 
$image = imagecreatefromjpeg($filename); 
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig); 

// СОЗДАЁМ
imagejpeg($image_p, null, 100); 

// УДАЛЯЕМ ИСХОДНИК - НУЖЕН АДРЕС. НАПРИМЕР, images/img001.jpg
unlink ($filename);

} else {
exit("Загружаемый файл не изображение...");
}
?>



Загрузка и вырезание части изображения в PHP


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

$upload_photo= $_FILES['upload_photo']['name']; // загружаемый из формы из поля upload_photo файл

$path_to_90_directory = 'images/';//папка, куда будет загружаться начальная картинка и ее сжатая копия
    
if(preg_match('/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['upload_photo']['name']))//проверка формата исходного изображения
     {    
              
        $filename = $_FILES['upload_photo']['name'];
        $source = $_FILES['upload_photo']['tmp_name'];    
        $target = $path_to_90_directory . $filename;
        move_uploaded_file($source, $target);//загрузка оригинала в папку $path_to_90_directory

    if(preg_match('/[.](GIF)|(gif)$/', $filename)) {
    $im = imagecreatefromgif($path_to_90_directory.$filename) ; //если оригинал был в формате gif, то создаем изображение в этом же формате. Необходимо для последующего сжатия
    }
    if(preg_match('/[.](PNG)|(png)$/', $filename)) {
    $im = imagecreatefrompng($path_to_90_directory.$filename) ;//если оригинал был в формате png, то создаем изображение в этом же формате. Необходимо для последующего сжатия
    }
    
    if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) {
        $im = imagecreatefromjpeg($path_to_90_directory.$filename); //если оригинал был в формате jpg, то создаем изображение в этом же формате. Необходимо для последующего сжатия
    }

$w = 200;  // квадратная 90x90. Можно поставить и другой размер.

// создаём исходное изображение на основе 
// исходного файла и определяем его размеры 
$w_src = imagesx($im); // определяем ширину
$h_src = imagesy($im); // определяем высоту изображения

         // создаём пустую квадратную картинку 
         // важно именно truecolor!, иначе будем иметь 8-битный результат 
         $dest = imagecreatetruecolor($w,$w); 

         // вырезаем квадратную серединку по x, если фото горизонтальное 
         if ($w_src>$h_src) 
         imagecopyresampled($dest, $im, 0, 0,
                          round((max($w_src,$h_src)-min($w_src,$h_src))/2),
                          0, $w, $w, min($w_src,$h_src), min($w_src,$h_src)); 

         // вырезаем квадратную верхушку по y, 
         // если фото вертикальное (хотя можно тоже серединку) 
         if ($w_src<$h_src) 
         imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
                          min($w_src,$h_src), min($w_src,$h_src)); 

         // квадратная картинка масштабируется без вырезок 
         if ($w_src==$h_src) 
         imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src); 
         

$date=time(); //вычисляем время в настоящий момент.


imagejpeg($dest, $path_to_90_directory.$date.".jpg"); //сохраняем изображение формата jpg в нужную папку, именем будет текущее время. Сделано, чтобы у изображений не было одинаковых названий.

//почему именно jpg? Он занимает очень мало места + уничтожается анимирование gif изображения, которое отвлекает пользователя. Не очень приятно читать его комментарий, когда краем глаза замечаешь какое-то движение.

$avatar = $path_to_90_directory.$date.".jpg"; //заносим в переменную путь до аватара.

$delfull = $path_to_90_directory.$filename; // получаем адрес исходника
unlink ($delfull); //удаляем оригинал загруженного изображения, он нам больше не нужен. Задачей было - получить миниатюру.


Если у Вас есть какие-либо свои примеры, вопросы или уточнения, то пишите!

Удаче в загрузке и обработке изображений!)
 



Похожие статьи


Комментарии к статье (vk.com)