- Автор темы
- #1
Вот достаточно неплохой скрипт для загрузки фоток с созданием миниатюр по заданным размером. Но вот миниатюра как то неправильно вырезается, получается не уменьшенная фотка - а вырванный кусок заданного размера из большой фотографии. Поправьте плиз, чтобы превьюшка получалась нормальной. Спасибо.
PHP:
<?
// поехали :)
if (!empty($_FILES['imgs'])) {
// назначим наши переменные
$imgs = $_FILES['imgs'];
$imgs_size = $_FILES['imgs']['size'];
$imgs_type = $_FILES['imgs']['type'];
$imgs_name = $_FILES['imgs']['name'];
$imgs_tmp_name = $_FILES['imgs']['tmp_name'];
// задаем максимальный вес картинки, если превышен, то выводим ошибку
if ($imgs_size > 5*1024*1000) die ('<center>Размер картинки превысил лимит в 5 МБ. <a href="'.$PHP_SELF.'">Загрузить заного</a></center>');
// получаем расширения файлов для загрузки
preg_match("'([a-z]+)\/[x\-]*([a-z]+)'", $imgs_type, $ext);
switch($ext[2]) {
case "jpg":
case "jpeg":
case "pjpeg":
break;
default: die("<center>Ошибка!<br />\n Допускаются файлы: <b>.jpg, .jpeg, .pjpeg</b> до 5МБ<br /> <a href='{$PHP_SELF}'>Загрузить заного</a></center>");
}
// задаем допустимые размеры картинок для загрузки
$width_max = 640;
$height_max = 480;
// получаем размеры
$img_size = getimagesize($imgs_tmp_name);
$width_original = $img_size[0];
$height_original = $img_size[1];
// еще одна проверка на размер загружаемых картинок, если превышен, то ошибка
if ($width_original < $width_max || $height_original < $height_max) die ("<center>Запрещено загружать картинки с размерами меньше {$width_max}x{$height_max}. <a href='{$PHP_SELF}'>Загрузить заного</a></center>");
// создадим пустое изображение с нужными нам размерами
$image_p = imagecreatetruecolor($width_max, $height_max);
// собственно создали :)
$image = imagecreatefromjpeg($imgs_tmp_name);
// определим пропорции для дальнейшей обрезки до них
$w_prp = ($width_original / $width_max);
$h_prp = ($height_original / $height_max);
// определим высоту и ширину будущих сжатых картинок
$p_w = ($width_max / $width_original);
$h_new = ($height_original * $p_w);
$y1 = (($h_new - $height_max) / 2);
$p_h = ($height_max / $height_original);
$w_new = ($width_original * $p_h);
$x1 = (($w_new - $width_max) / 2);
// описываем когда приходиться сжимать ширину, а высоту резать
if ($w_prp < $h_prp) {
$image_p_1 = imagecreatetruecolor($width_max, $h_new);
// выполним копирование и ресамдлинг нашей картинки, т.е. с помощью GD библиотеки сгладим и заполним промежуточными цветами недостающие точки
imagecopyresampled($image_p_1, $image, 0, 0, 0, 0, $width_max, $h_new, $width_original, $height_original);
imagecopyresampled($image_p, $image_p_1, 0, 0, 0, $y1, $width_max, $height_max, $width_max, $height_max);
}
// описываем когда приходиться сжимать высоту, а ширину резать
elseif ($w_prp > $h_prp) {
$image_p_1 = imagecreatetruecolor($w_new, $height_max);
// сного выполним копирование и ресамдлинг нашей картинки, т.е. с помощью GD библиотеки сгладим и заполним промежуточными цветами недостающие точки
imagecopyresampled($image_p_1, $image, 0, 0, 0, 0, $w_new, $height_max, $width_original, $height_original);
imagecopyresampled($image_p, $image_p_1, 0, 0, $x1, 0, $width_max, $height_max, $width_max, $height_max);
}
// если все размеры соблюдены, то сжимаем
elseif ($w_h_prp == $curr_prp) {
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width_max, $height_max, $width_original, $height_original);
}
// определяем время для названия картинки, удобно если заносим в базу сортировать по времени добавления
$time = time();
// определяем пути до картинок и их миниатюр и названия для них
$imgs_path = "images/full/{$time}.jpg";
$thumb_path = "images/thumbs/{$time}.jpg";
if (imagejpeg($image_p, $imgs_path, 100)) {
// если все замечательно, создаем файл миниатюры, метод немного отличается для разнообразия от того, что описан выше, если захотите можете потренироваться и сделать создание миниатюр так же как и выше
$thumb_width = 150;
$thumb_height = 113;
$thumb = imagecreatetruecolor($thumb_width, $thumb_height);
$w_point = (($width_original - $thumb_width) / 2);
$h_point = (($height_original - $thumb_height) / 2);
imagecopyresampled($thumb, $image, 0, 0, $w_point, $h_point, $thumb_width, $thumb_height, $thumb_width, $thumb_height);
imagejpeg($thumb, $thumb_path, 100);
// описываем вывод, опять же, если захотите можете выводить запрос в базу данных или куда еще будет угодно
$vvd = "тут можно отправить запрос в базу";
if ($vvd) {
echo "<div align='center'><img src='$imgs_path' alt='image' /><br /><h4>Изображение успешно загружено</h4><img src='$thumb_path' alt='image' /><br /><h4>Его миниатюра удачно создана.</h4><br /><h2>Поздравляем!!!</h2><br />\n<a href='{$PHP_SELF}'>Загрузить ещё</a></div>";
}
// очередная проверка, если картинка ни куда не добавлена, то ошибка
else {
echo "Ошибка. Картинка не добавлена!";
unlink($imgs_path);
unlink($thumb_path);
}
}
// вывод ошибки при копировании
else print ("Ошибка!");
}
else {
// ну и наконец то наша форма для загрузки картинок
echo "<html>\n";
echo "<head>\n";
echo "<meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>\n";
echo "<title>Загрузка изображений</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<div align='center'><h1>Загрузка изображений:</h1>\n";
echo "<form action='{$PHP_SELF}' method='post' enctype='multipart/form-data'>\n";
echo "<h3>Выбрать файл для загрузки:</h3><input name='imgs' type='file' size='50' /><br /><br />\n";
echo "<input type='submit' value='Загрузить' /> <input type='reset' value='Отменить'><br />Разрешено загружать только: <b>.jpg, .jpeg, .pjpeg</b> файлы весом до 5МБ.<br />\n";
echo "</form>\n";
echo "</div>\n";
echo "</body>\n";
echo "</html>";
}
// и в конце то концов, это метод загрузки картинок расширений джипег, для остальных разрешений, если захотите можете написать свои функции, используя например такие функции как imagecreatefromgif, imagecreatefrompng и т.д.
?>