Изменяем размер изображения сохраняя пропорции. Часть 2.

В предыдущем посте я уже писал о том как можно изменить изображения сохранив его пропорции, но было несколько нюансов: можно было изменить только jpg картинку и хоть пропорции и сохранялись но миниатюры было не удобно делать т.к. формат миниатюры оставался тем же. 

ВНИМАНИЕ.
Содержимое данной статьи морально устарело но сохранено для академических целей.

Дальше я расскажу как избежать все эти подводные камни и сделать хорошие миниатюры.Во первых я сразу буду использовать форму для загрузки картинки ( так проще тестировать скрипт ).

<form action="" method="post" name="img_folder_edit" enctype="multipart/form-data">
<input name="userfile" type="file" style="width: 200px;" >
<input type="submit" name="image_upload" value="UPLOAD" style="margin-left:20px;" >
</form>
<?php
if ($_POST['image_upload']){
  $uploaddir = 'image/tmp_image/'; # Папка загрузки
  $extentions = array('1','2','3','6'); # определяем типы разрешенных файлов
  $userfilesize = $_FILES['file']['size'];
  $maxfilesize = 1024*1024*7; # Максимальный размер файла в данный момент 7Мб
  $width = 200; # Максимальная ширина миниатюры
  $height = 160;  # Максимальная высота миниатюры
  $file_type = exif_imagetype($_FILES['userfile']['tmp_name']); # определяем тип файла
  if (in_array($file_type, $extentions) && ($maxfilesize >= $userfilesize)){
    switch ($file_type) {
      case '2': $file_type = '.jpg'; break;
      case '3': $file_type = '.png'; break;
      case '1': $file_type = '.gif'; break;    
      case '6': $file_type = '.bmp'; break;
      default: print 'Неизвестная ошибка в определении типа файла<br />';
    }
    $new_image = 'two'.$file_type;
    $basename = 'one'.$file_type;
    move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir.$basename); #загружаем картинку
    $ext = $file_type; # Получаем формат уменьшаемого изображения
    list($width_orig, $height_orig) = getimagesize($uploaddir.$basename); # получаем размеры изображения
    $ratio_orig = $width_orig/$height_orig;  
    if ($width/$height > $ratio_orig) {
      $width = $height*$ratio_orig;
    } else {
      $height = $width/$ratio_orig;
    }
    $image_p = imagecreatetruecolor($width, $height);
    switch ($ext) {
            case '.jpg': $source = imagecreatefromjpeg($uploaddir.$basename); break;
            case '.gif': $source = imagecreatefromgif($uploaddir.$basename); break;
            case '.png': $source = imagecreatefrompng($uploaddir.$basename); break;    
            case '.bmp': $source = imagecreatefromwbmp($uploaddir.$basename); break;
        }
    imagecopyresampled($image_p, $source, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
        switch ($ext) {
            case '.jpg': imagejpeg($image_p, $uploaddir.$new_image, 100); break;                
            case '.gif': imagegif($image_p, $uploaddir.$new_image);  break;                
            case '.png': imagepng($image_p, $uploaddir.$new_image); break;                
            case '.bmp': imagewbmp($image_p, $uploaddir.$new_image); break;
        }
 
    # выводы текста  
    print 'Upload comlete <br />';
    print $width_orig.'x'.$height_orig. '<br />';
    print 'new size'.$width.'x'.$height.'<br />';
    print '<img src="'.$uploaddir.$new_image.'"</a>';
    # освобождаем память
    imagedestroy($image_p);
      imagedestroy($source);
  } else {
   
    print 'Размер файла слишком большой или файл имеет не поддерживаемое расщирение';
  }
 
}
?>

Для начала мы задаем параметры для работы: папку загрузки, типы файлов (jpg, png, gif, bmp), определяем размер файла и максимальный разрешенный размер файла, а так же ширину и высоту (максимальную) миниатюры. Выходное изображение будет не больше 200×160 пикселей при этом сохранит формат (16:9, 16:10, 4:3 и т.д.) и не будет пиксилизированно!

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

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

Copyright © Programmer Weekdays | Powered by WordPress