Загрузчик для галереи

 

Очень долго думал, что же написать в блоге, ведь как всегда я наметил создать что-то что мне не по силам =( Вообщем этот блог создавался для написание на нем статей на тему веб программирование, в веб программирование я новечек (даже имея небольшой стаж) много чего не понимаю, и много чего не знаю... Вообщем подумав я решил писать тут свои наблюдения, пускай даже если они уже давно открыты (а именно так оно и есть =))) Это поможет мне сконцентрировать всю мою информацию в одном месте, так же это поможет некоторым моим знакомы, которые тоже пытаются чему то научится в области программирования...ну может это еще поможет кому то не знакомому мне =))

 

 

Так, теперь ближе к делу =) решил выложить не большой скриптик позволяющий загрузить на сервер изображения любого размера, но перед сохранением на сервере сделать пред просмотр изображения (100 на 100 пикселей) так же обработать полное изображения изменив его разрешение. Максимальный размер изображения будет 700 на 700 пикселей. Мой скрипт используется в некоторых моих работах, именно из-за этого я не стану выкладывать его полностью, так как в полной версии присутствуют элементы защиты, о которых не нужно знать посторонним людям в целях защиты =)

Логика такая:

Мы имеем форму с кнопкой “обзор” (наверняка видели такие =)) при выборе загружаемого изображения скрипт генерирует новое название для изображения.

После проверяем разрешение исходного изображения, если ширина и высота изображения меньше или равна 700 пикселей то создаем изображение с новым именем (которое генерировали до этого) на сервере и заканчиваем операцию.

Если ширина и высота изображение больше 700 пикселей то нам для начала надо узнать, вертикальное изображение (т.е. высота изображение больше чем ширина) или горизонтальное. Это нужно для того что бы пропорционально уменьшить изображение. Например, если мы имеем изображение 1000 на 600 пикселей, то скрипт нам выявит, что оно горизонтальное, так как ширина его больше высоты, это означает, что ширину мы можем без укореняя совести уменьшить до 700 пикселей, а высоту пропорционально на сколько то =) Возникает вопрос, на сколько? Об этом ниже =)

Продолжим логику =) если изображение вертикальное, то делим высоту на 700 пикселей. Так мы узнаем во сколько раз нам нужно уменьшить ширину. Например, если у нас изображение 600 на 1000 то для того, что бы узнать во сколько раз нам уменьшить ширину мы делим 1000 на 700, получаем 1,428571428571429. После, 600 делим на 1,428571428571429 получаем 419,9999999999999 и того, округляя, мы получаем новое изображение высотой в 700 пикселей и шириной 420 пикселей

Если изображение горизонтальное, то проделываем туже операцию с пропорцией, но только уже для высоты

Если изображение квадратное, то просто уменьшаем его до 700-а пикселей по ширине и 700-а пикселей по высоте.

Сохраняем на сервере полное изображение, и приступаем к созданию мини изображения. Вот тут возникает небольшая проблема… При уменьшения изображения с высотой в 600 пикселей а шириной в 1000 в изображение разрешением 100 на 100 мы получим очень плохой визуальный эффект… это сложно объяснить, поэтому я покажу =)

Думаю понятно =) Для того что бы не было такого ужасного искажения вырежем эти 100 на 100 пикселей из центра полного изображения, примерно вот так:

Как показывает практика, люди пытаются делать такие фото, на которых объект, который они фоткают был в центре фотографии, так что процент того что на мини изображения будут обрезанные лица или пол дерева, не велики =)

Продолжаем логику =) если изображение горизонтальное значит нам надо из ширины вычесть высоту для того что бы узнать сколько отступать от края. Например если у нас имеется изображение 1000 на 600, то из 1000 вычитаем 600, получаем 400 пикселей, далее мы 400 делим на 2, получаем 200 пикселей. В конце этой операции мы выявили, что от края надо отступить 200 пикселей и только потом вырезать изображение высотой 600 на 600, после уменьшить его до 100 на 100 пикселей…

Если изображение вертикальное то проделываем ту же операцию, что и с горизонтальным, но только из высоты надо вычесть ширину

Если изображение квадратное, то просто уменьшаем его до разрешения 100 на 100 пикселей
В принципе это все…Ниже я приведу код, с некоторыми комментариями:

<?
function obr_img($n_up,$w_new,$h_new,$w_up,$h_up,$n_new,$b_or_m,$obrez_w,$obrez_h)
//$n_up - Загружаемый файл
//$w_new - Ширина нового файла
//$h_new - Высота нового файла
//$w_up - Ширина загружаемого файла
//$h_up - Высота загружаемого файла
//$n_new - Имя нового файла
//$b_or_m - Предпросмотор (0) или основной файл (1)
//$obrez_h - Координаты для обрезания исходного изображение (по дефолту 0)
//$obrez_w - Координаты для обрезания исходного изображение (по дефолту 0)
{
$instant = imagecreatefromjpeg($n_up);
$new_img = imagecreatetruecolor($w_new, $h_new);
if($b_or_m == 0)
{
$h_up -= $obrez_h;
$obrez_h = 0;
$w_up -= $obrez_w;
$obrez_w /= 2;
}
imagecopyresampled($new_img,$instant,0,0,$obrez_w,$obrez_h,$w_new,
$h_new,$w_up,$h_up);
if($b_or_m == 0)
imagejpeg($new_img, "upload/mini/".$n_new.".jpg", 100);
if($b_or_m == 1)
imagejpeg($new_img, "upload/big/".$n_new.".jpg", 100);
imagedestroy($new_img);
imagedestroy($instant);
}

if(isset($_FILES['userfile']))$loadfile = $_FILES['userfile']; else $loadfile = "";
$Wnewimg = 700;//Ширина нового изображение (дефолт 700px)
$Hnewimg = 700;//Высота нового изображение (дефолт 700px)
$Wnewminiimg = 100;//Ширина нового мини изображение (дефолт 100px)
$Hnewminiimg = 100;//Высота нового мини изображение (дефолт 100px)
if($loadfile != "")
{
//Имена картинок
$name_img = date("His");
$indifikator = mt_rand(1, 10000);
$name_img = $name_img.$indifikator;
$name_small = "small_".$name_img;
$name_big = "big_".$name_img;
//Имена картинок
$size = getimagesize($loadfile['tmp_name']);

if($size[0] <= $Wnewimg AND $size[1] <= $Hnewimg)//Если фото не надо...
{
obr_img($loadfile['tmp_name'],$size[0],
$size[1],$size[0],$size[1],
$name_big,1,0,0);}//...уменьшать в размере

else//Если надо (фото больше чем 700х700 px)
{
if($size[0] < $size[1])//Если вертикальное изображение
{
$h_rb = $size[1]/$Hnewimg;
$wb = $size[0]/$h_rb; $hb = $Hnewimg;
}
else//Если горизонтальное изображение
{
$w_rb = $size[0]/$Wnewimg;
$hb = $size[1]/$w_rb; $wb = $Wnewimg;
}

if($size[0] == $size[1])//Квадратное изображение
{
$wb = $Wnewimg; $hb = $Hnewimg;
}


obr_img($loadfile['tmp_name'],$wb,$hb,$size[0],
$size[1],$name_big,1,0,0);
}

//Создание мини изображения
if($size[0] > $size[1])//Горизонтальное изображение
{
$obrez_w = $size[0] - $size[1];$obrez_h = 0;
}
else//Вертикальное изображение
{
$obrez_h = $size[1] - $size[0];$obrez_w = 0;
}
if($size[0] == $size[1])//Кавадратное
{
$obrez_h = 0;$obrez_w = 0;
}
obr_img($loadfile['tmp_name'],$Wnewminiimg,$Hnewminiimg,$size[0],
$size[1],$name_small,0,$obrez_w,$obrez_h);
//Создание мини изображения
}
?>
<form action="gallery.php" method="post" ENCTYPE="multipart/form-data" name="f_img">

<table width="500" border="0" cellspacing="5" cellpadding="0" align="center">
<tr>
<td colspan="2" align="left"><input size="50" name="userfile" type="file"></td>
</tr>
<tr>
<td colspan="2" align="center"><input name="submit" type="submit"
value="Добавить фотографию"></td>
</tr>
</table>
</form>

Для того что бы скрипт работал правильно, необходимо файл назвать "gallery.php" так как в форме, в качестве обработчика стоит именно этот файл. Так же в скрипте мы не создавали директорию, поэтому в каталоге, где вы поместили этот скрипт, следует создать папку "upload" а в ней еще 2 папки "mini" и "big"

 

Возможно Вам будут интересны следующие заметки

Комментарии (1)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Mini, 02 Мая 2016 г. 07:13 пишет:
Гость
Спасибо большое за скрипт,искал что то подомное уже пару дней,перебрал все варианты,так как функции php писать ещё не пробовал,самому мне это было бы сделать сложновато,да и времени нет.Скрипт конечно в чём то устарел,но я попробую его подкорректировать под свои нужды,короче можно вдохнуть с облегчением.Спасибо!