Изменяем размер изображения сохраняя пропорции. Часть 2.
В предыдущем посте я уже писал о том как можно изменить изображения сохранив его пропорции, но было несколько нюансов: можно было изменить только 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) && ($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 и т.д.) и не будет пиксилизированно!
Спасибо, попробую уловить суть и переписать под свой проект.
[Ответить]
ZekMan Reply:
Сентябрь 16th, 2010 at 18:14
Всегда пожалуйста 🙂
[Ответить]
Тоже поблагодарю автора, осень нужный скрипт
[Ответить]
Спасибо. Только вот беда bmp формат не кушает
[Ответить]
ZekMan Reply:
Май 1st, 2012 at 23:00
BMP своеобразный формат — весит много и плохое качество изображения. Но судя по вашему комментарию — иногда и он нужен. Так что позже доделаю, добавлю bmp
[Ответить]
жалко
Call to undefined function exif_imagetype()
[Ответить]
ZekMan Reply:
Март 26th, 2013 at 02:07
Как я понимаю у Вас сервер на 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.
[Ответить]