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

Август 25th, 2010 Рубрики: PHP coubertin.cz www.colvillewoodworking.com

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<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) &amp;&amp; ($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 и т.д.) и не будет пиксилизированно!

Теги: ,

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

  1. Сентябрь 16th, 2010 at 14:03
    1

    Спасибо, попробую уловить суть и переписать под свой проект.

    [Ответить]

    ZekMan Reply:

    Всегда пожалуйста 🙂

    [Ответить]

  2. Ноябрь 13th, 2010 at 01:19
    2

    Тоже поблагодарю автора, осень нужный скрипт

    [Ответить]

  3. Роман
    Апрель 30th, 2012 at 19:08
    3

    Спасибо. Только вот беда bmp формат не кушает

    [Ответить]

    ZekMan Reply:

    BMP своеобразный формат — весит много и плохое качество изображения. Но судя по вашему комментарию — иногда и он нужен. Так что позже доделаю, добавлю bmp

    [Ответить]

  4. kowap
    Март 25th, 2013 at 17:23
    4

    жалко
    Call to undefined function exif_imagetype()

    [Ответить]

    ZekMan Reply:

    Как я понимаю у Вас сервер на Windows? Какой именно?
    Комментарий на php.net гласит:
    Windows users: If you get the fatal error «Fatal error: Call to undefined function exif_imagetype()», and you have enabled php_exif.dll, make sure you enable php_mbstring.dll. You must put mbstring before exif in the php.ini, i.e.:
    extension=php_mbstring.dll
    extension=php_exif.dll
    You can check whether this has worked by calling phpinfo() and searching for exif.

    [Ответить]

Написать комментарий