0 / 0 / 2
Регистрация: 31.12.2014
Сообщений: 226
1

Создание изображения и его копии в уменьшеном размере

10.06.2015, 00:01. Показов 1519. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток, столкнулся с такой проблемой, ни как не могу сообразить как реализовать подобный скрипт, пользователь загружает изображение jpg gif или png, это изображение подгоняется под заданный размер и сохраняется в папке, так же это изображение делается другое, квадратное, которое сохраняется в другую папку.
Под заданный размер я подогнать и сохранить смог однако копию его в уменьшенном размере не получается сохранить, выдает ошибку, вот как я это реализовал:
PHP
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['fupload']['name']))//проверка формата исходного изображения
                             {     
                             move_uploaded_file($_FILES['fupload']['tmp_name'], $uploadfile);   
                             move_uploaded_file($_FILES['fupload']['tmp_name'], $uploadfilemin);  
                             if(preg_match('/[.](GIF)|(gif)$/',    $uploadfile)) {
                            $im    = imagecreatefromgif($uploadfile) ; //если оригинал был в формате gif, то создаем    изображение в этом же формате. Необходимо для последующего сжатия
                            }
                             if(preg_match('/[.](GIF)|(gif)$/',    $uploadfilemin)) {
                            $immin    = imagecreatefromgif($uploadfilemin) ; //если оригинал был в формате gif, то создаем    изображение в этом же формате. Необходимо для последующего сжатия
                            }
                            if(preg_match('/[.](PNG)|(png)$/', $uploadfile)) {
                            $im =    imagecreatefrompng($uploadfile) ;//если    оригинал был в формате png, то создаем изображение в этом же формате.    Необходимо для последующего сжатия
                            }
                             if(preg_match('/[.](PNG)|(png)$/', $uploadfilemin)) {
                            $immin =    imagecreatefrompng($uploadfilemin) ;//если    оригинал был в формате png, то создаем изображение в этом же формате.    Необходимо для последующего сжатия
                            }
                            
                            if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/',    $uploadfile)) {
                                           $im =    imagecreatefromjpeg($uploadfile); //если оригинал был в формате jpg, то создаем изображение в этом же    формате. Необходимо для последующего сжатия
                            }  
                             if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/',    $uploadfilemin)) {
                                           $immin =    imagecreatefromjpeg($uploadfilemin); //если оригинал был в формате jpg, то создаем изображение в этом же    формате. Необходимо для последующего сжатия                            
                            }      
                             $size = getimagesize($uploadfile);
    if ($size[0] == 150 && $size[1] == 206) {          
                              $result4 = $conn->query("UPDATE users SET    avatar='$uploadfile' WHERE login='$old_email'");                     
    }
    else {
    function imageresize($uploadfile,$uploadfile,$neww,$newh,$quality) {
    $im=imagecreatefromjpeg($uploadfile);
    $im1=imagecreatetruecolor($neww,$newh);
    imagecopyresampled($im1,$im,0,0,0,0,$neww,$newh,imagesx($im),imagesy($im));
    imagejpeg($im1,$uploadfile,$quality);
    imagedestroy($im);
    imagedestroy($im1);
    }
    imageresize("$uploadfile","$uploadfile",150,206,100);
    $result4 = $conn->query("UPDATE users SET    avatar='$uploadfile' WHERE email='$old_email'");  
    }
    
            //    dest - результирующее изображение 
            //    w - ширина изображения 
            //    ratio - коэффициент пропорциональности 
            $size = getimagesize($uploadfilemin);
            if ($size[0] == 100 && $size[1] == 100) { 
            $result4 = $conn->query("UPDATE users SET    avatarmin='$uploadfilemin' WHERE email='$old_email'"); 
            }
 
$w = 100;  // квадратная    90x90. Можно поставить и другой размер.
//    создаём исходное изображение на основе 
            //    исходного файла и определяем его размеры 
            $w_src = imagesx($immin); //вычисляем ширину
            $h_src = imagesy($$immin); //вычисляем высоту изображения
         //    создаём пустую квадратную картинку 
                     // важно именно truecolor!, иначе    будем иметь 8-битный результат 
                     $dest = imagecreatetruecolor($w,$w); 
//    вырезаем квадратную серединку по x, если фото горизонтальное 
                     if ($w_src>$h_src) 
                        imagecopyresampled($dest, $immin, 0, 0,
                                         round((max($w_src,$h_src)-min($w_src,$h_src))/2),
                                     0, $w, $w,    min($w_src,$h_src), min($w_src,$h_src)); 
            // вырезаем квадратную верхушку по    y, 
                     // если фото вертикальное (хотя    можно тоже серединку) 
                     if ($w_src<$h_src) 
                        imagecopyresampled($dest, $immin, 0, 0, 0, 0, $w, $w,
                                      min($w_src,$h_src),    min($w_src,$h_src)); 
         //    квадратная картинка масштабируется без вырезок 
                     if ($w_src==$h_src) 
                     imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src); 
                                            
$date=time(); //вычисляем время в настоящий момент.
            imagejpeg($dest, $uploadfilemin);//сохраняем изображение формата jpg
$delfull =  $uploadfilemin; 
            unlink ($delfull);//удаляем оригинал загруженного изображения, он нам    больше не нужен. Задачей было - получить миниатюру.
                             }}
$result4 = $conn->query("UPDATE users SET    avatarmin='$avatarmin' WHERE email='$old_email'");//обновляем аватар в базе 
          //  if ($result4=='TRUE') {//если верно, то отправляем на личную страничку
            //echo "<html><head><meta    http-equiv='Refresh' content='5;    URL=page.php?id=".$_SESSION['id']."'></head><body>Ваша аватарка изменена! Вы    будете перемещены через 5 сек. Если не хотите ждать, то <a href='page.php?id=".$_SESSION['id']."'>нажмите    сюда.</a></body></html>";}
      }
Выдает вот такие ошибки:
Warning: getimagesize(avatarsmin/20150609191811956): failed to open stream: No such file or directory in /Users/n0kk/Sites/nlp/updateuser.php on line 205
Notice: Undefined variable: immin in /Users/n0kk/Sites/nlp/updateuser.php on line 213
Notice: Undefined variable: immin in /Users/n0kk/Sites/nlp/updateuser.php on line 214
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2015, 00:01
Ответы с готовыми решениями:

Создание уменьшеной копии изображения
подскажите плиз, у меня такая проблема, дело в том что у меня стоит Создание уменьшеной копии...

Создание уменьшеной копии изображения
Я скачал картинки с сервера на свой компьютер. Так вот мне надо создать уменьшенную копию...

Создание Thumb - маленькой копии файла изображения
Вообщем нужен механизм, создающий маленькие копии из файлов больших изображений (фиксированного...

Удаление компонента и последующее создание его копии
То есть компонент исчезает с лица формы с помощью функции delete(CutegoryButtons), а потом нужно...

14
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
10.06.2015, 00:18 2
Смотрите внимательнее - скрипт просто не может найти файл, который Вы пытаетесь ему "скормить".. в данном конкретном случае нет файла avatarsmin/20150609191811956
0
0 / 0 / 2
Регистрация: 31.12.2014
Сообщений: 226
10.06.2015, 00:46  [ТС] 3
Laroux, да я это понял, но почему не может найти вот же он move_uploaded_file($_FILES['fupload']['tmp_name'], $uploadfilemin);
0
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
10.06.2015, 01:01 4
а переменная $uploadfilemin определена ранее?
а папка avatarsmin имеется?
А права на на папку avatarsmin имеются?.. ну и т.д.

Добавлено через 4 минуты
Кстати, во избежание таких вот траблов рекомендуется использовать какую-нить проверочку.. типа
PHP
1
2
3
4
5
6
if ($_FILES['attach_file']['tmp_name']) { 
              if (!move_uploaded_file($_FILES['attach_file']['tmp_name'], $upfile)) 
              { echo "Невозможно переместить файл ".$_FILES['attach_file']['tmp_name']." в каталог назначения ".$upfile; 
                 exit; } else { //кодим дальше
} 
else { echo "А работать и не с чем(("; }
0
0 / 0 / 2
Регистрация: 31.12.2014
Сообщений: 226
10.06.2015, 01:02  [ТС] 5
Laroux,
переменная $uploadfilemin
PHP
1
2
3
4
$uploaddirmin = 'avatarsmin/';
@mkdir($uploaddirmin, 0777);
$apend=date('YmdHis').rand(100,1000);
$uploadfilemin = "$uploaddirmin$apend";
папка имеется
выполнял для нее
sudo chmod -R 0777 /Users/n0kk/Sites/nlp/avatarsmin
0
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
10.06.2015, 01:04 6
может надо
PHP
1
$uploadfilemin = $uploaddirmin.$apend;
?
0
0 / 0 / 2
Регистрация: 31.12.2014
Сообщений: 226
10.06.2015, 01:09  [ТС] 7
Laroux, а переменная $uploadfile = "$uploaddir$apend"; определена так же но изображение нормально добавляется в папку и изменяется размер
0
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
10.06.2015, 01:15 8
Так, стоп.. не обратил внимания сразу: вы же уже вызвали один раз функцию move_uploaded_file. Она вам перенесла файл в $uploadfile. Все.. файла $_FILES['fupload']['tmp_name'] уже не существует.
По-моему так..

Поэтому вы сначала делайте
PHP
1
move_uploaded_file($_FILES['fupload']['tmp_name'], $uploadfile);
а следующей строкой
PHP
1
copy($uploadfile, $uploadfilemin);
и будет Вам счастье
0
387 / 294 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
10.06.2015, 02:40 9
Я бы не стал делать костыли, а использовал готовую реализацию: CImageHandler. Без проблем это сделает.
0
0 / 0 / 2
Регистрация: 31.12.2014
Сообщений: 226
10.06.2015, 14:49  [ТС] 10
Laroux,
Цитата Сообщение от Laroux Посмотреть сообщение
Кстати, во избежание таких вот траблов рекомендуется использовать какую-нить проверочку.. типа
Код PHP
if ($_FILES['attach_file']['tmp_name']) {
* * * * * * * if (!move_uploaded_file($_FILES['attach_file']['tmp_name'], $upfile))
* * * * * * * { echo "Невозможно переместить файл ".$_FILES['attach_file']['tmp_name']." в каталог назначения ".$upfile;
* * * * * * * * *exit; } else { //кодим дальше
}
else { echo "А работать и не с чем(("; }
а вот такая не пойдет проверка? Просто начало скрипта не скинул
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 if    (isset($_FILES['fupload']['name'])) //отправлялась    ли переменная
                  {
if (empty($_FILES['fupload']['name'])) 
{
            //если    переменная пустая (пользователь не отправил изображение),то присваиваем ему    заранее приготовленную картинку с надписью "нет аватара"
            $avatar =  "avatars/defaultava.png"; //можете    нарисовать net-avatara.jpg или взять в исходниках
            $avatarmin = "avatarsmin/defaultavamin.png";
            $result7 = $conn->query("SELECT avatar, avatarmin  FROM users WHERE email='$old_email'");//извлекаем текущий аватар 
            $myrow7 = $result7->fetch_assoc();
            if ($myrow7['avatar'] == $ava)    {//если аватар был стандартный, то не удаляем    его, ведь у на одна картинка на всех.
            $ava = 1;
            }
            else {unlink    ($myrow7['avatar']);}//если аватар был свой, то    удаляем его, затем поставим стандарт
            
            if ($myrow7['avatarmin'] == $avamin)    {//если аватар был стандартный, то не удаляем    его, ведь у на одна картинка на всех.
            $avamin = 1;
            }
            else {unlink    ($myrow7['avatarmin']);}//если аватар был свой, то    удаляем его, затем поставим стандарт
}}
Я сделал как вы сказали
Цитата Сообщение от Laroux Посмотреть сообщение
copy($uploadfile, $uploadfilemin);
Ошибка Warning: getimagesize(avatarsmin/20150609191811956): failed to open stream: No such file or directory in /Users/n0kk/Sites/nlp/updateuser.php on line 205 пропала, но все равно не видет переменную $immin, хотя при выводе echo $uploadfilemin отображается путь до изображения, возможно где то тут проблема

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if(preg_match('/[.](GIF)|(gif)$/',    $uploadfile)) {
                            $im    = imagecreatefromgif($uploadfile) ; //если оригинал был в формате gif, то создаем    изображение в этом же формате. Необходимо для последующего сжатия
                            }
                             if(preg_match('/[.](GIF)|(gif)$/',    $uploadfilemin)) {
                            $immin    = imagecreatefromgif($uploadfilemin) ; //если оригинал был в формате gif, то создаем    изображение в этом же формате. Необходимо для последующего сжатия
                            }
                            if(preg_match('/[.](PNG)|(png)$/', $uploadfile)) {
                            $im =    imagecreatefrompng($uploadfile) ;//если    оригинал был в формате png, то создаем изображение в этом же формате.    Необходимо для последующего сжатия
                            }
                             if(preg_match('/[.](PNG)|(png)$/', $uploadfilemin)) {
                            $immin =    imagecreatefrompng($uploadfilemin) ;//если    оригинал был в формате png, то создаем изображение в этом же формате.    Необходимо для последующего сжатия
                            }
                            
                            if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/',    $uploadfile)) {
                                           $im =    imagecreatefromjpeg($uploadfile); //если оригинал был в формате jpg, то создаем изображение в этом же    формате. Необходимо для последующего сжатия
                            }  
                             if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/',    $uploadfilemin)) {
                                           $immin =    imagecreatefromjpeg($uploadfilemin); //если оригинал был в формате jpg, то создаем изображение в этом же    формате. Необходимо для последующего сжатия                            
                            }
0
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
10.06.2015, 15:18 11
по поводу проверки: у вас же там почти написано, что проверяется - сначала вообще наличие $_FILES['fupload']['name'], а потом не пустой ли у Вас $_FILES['fupload']['name'].
А потом же Вы еще этот $_FILES['fupload']['name'] переносите в папку.. и тут же тож могут быть проблемы. Вот эту проверку я Вам и написал.

по коду. Попробуйте вместо своего куска вставить такой:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(preg_match('/[.](GIF)|(gif)$/',    $uploadfile))
{ $im    = imagecreatefromgif($uploadfile) ; //если оригинал был в формате gif, то создаем    изображение в этом же формате. Необходимо для последующего сжатия
echo "im gif"; }
elseif(preg_match('/[.](PNG)|(png)$/', $uploadfile)) 
{ $im =    imagecreatefrompng($uploadfile) ;//если    оригинал был в формате png, то создаем изображение в этом же формате.    Необходимо для последующего сжатия
echo "im png"; }
elseif(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/',    $uploadfile))
{ $im =    imagecreatefromjpeg($uploadfile); //если оригинал был в формате jpg, то создаем изображение в этом же    формате. Необходимо для последующего сжатия
echo "im jpg";
} else { echo "переменная im не создалась!"; }
 
if(preg_match('/[.](GIF)|(gif)$/',    $uploadfilemin))
{ $immin    = imagecreatefromgif($uploadfilemin) ; //если оригинал был в формате gif, то создаем    изображение в этом же формате. Необходимо для последующего сжатия
echo "immin gif"; }
elseif(preg_match('/[.](PNG)|(png)$/', $uploadfilemin))
{ $immin =    imagecreatefrompng($uploadfilemin) ;//если    оригинал был в формате png, то создаем изображение в этом же формате.    Необходимо для последующего сжатия
echo "immin png"; }
elseif(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/',    $uploadfilemin))
{ $immin =    imagecreatefromjpeg($uploadfilemin); //если оригинал был в формате jpg, то создаем изображение в этом же    формате. Необходимо для последующего сжатия                            
echo "immin jpg"; }    else { echo "переменная immin не создалась!"; }
что выведет?
0
0 / 0 / 2
Регистрация: 31.12.2014
Сообщений: 226
10.06.2015, 16:34  [ТС] 12
KeyGen, Вы правы безусловно, но мне хочется разобраться, ведь по компоненту мне врятли получится изучить PHP

Добавлено через 4 минуты
Laroux, вывелось: переменная im не создалась!переменная immin не создалась!
0
172 / 167 / 75
Регистрация: 21.11.2014
Сообщений: 1,490
10.06.2015, 16:43 13
значит у вас с условиями беда.. они неправильно отрабатывают
0
79 / 79 / 36
Регистрация: 28.02.2014
Сообщений: 400
10.06.2015, 20:43 14
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
//$orig_width-розмер
//$orig_height-розмер
list($orig_width, $orig_height, $type) = getimagesize($filename);
if($type == 1) {
        $image = imageCreateFromGif($filename);
   }
   if($type == 2) {
        $image = imageCreateFromJpeg($filename); 
   } 
   if($type == 3) {
        $image = imageCreateFromPng($filename);
   }
 
?>
ну типа того
0
0 / 0 / 2
Регистрация: 31.12.2014
Сообщений: 226
11.06.2015, 19:16  [ТС] 15
Seovin, этим заменить мой код?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 $im    = imagecreatefromgif($uploadfile) ; //если оригинал был в формате gif, то создаем    изображение в этом же формате. Необходимо для последующего сжатия
                            }
                             if(preg_match('/[.](GIF)|(gif)$/',    $uploadfilemin)) {
                            $immin    = imagecreatefromgif($uploadfilemin) ; //если оригинал был в формате gif, то создаем    изображение в этом же формате. Необходимо для последующего сжатия
                            }
                            if(preg_match('/[.](PNG)|(png)$/', $uploadfile)) {
                            $im =    imagecreatefrompng($uploadfile) ;//если    оригинал был в формате png, то создаем изображение в этом же формате.    Необходимо для последующего сжатия
                            }
                             if(preg_match('/[.](PNG)|(png)$/', $uploadfilemin)) {
                            $immin =    imagecreatefrompng($uploadfilemin) ;//если    оригинал был в формате png, то создаем изображение в этом же формате.    Необходимо для последующего сжатия
                            }
                            
                            if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/',    $uploadfile)) {
                                           $im =    imagecreatefromjpeg($uploadfile); //если оригинал был в формате jpg, то создаем изображение в этом же    формате. Необходимо для последующего сжатия
                            }  
                             if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/',    $uploadfilemin)) {
                                           $immin =    imagecreatefromjpeg($uploadfilemin); //если оригинал был в формате jpg, то создаем изображение в этом же    формате. Необходимо для последующего сжатия                            
                            }
Добавлено через 10 часов 35 минут
Laroux,
Цитата Сообщение от Laroux Посмотреть сообщение
значит у вас с условиями беда.. они неправильно отрабатывают
Я убрал условия, присвоил значения переменной напрямую, все равно вылезают ошибки
Warning: imagesx() expects parameter 1 to be resource, string given in /Users/n0kk/Sites/nlp/updateuser.php on line 201
Warning: imagesy() expects parameter 1 to be resource, string given in /Users/n0kk/Sites/nlp/updateuser.php on line 202
Warning: imagecopyresampled() expects parameter 2 to be resource, string given in /Users/n0kk/Sites/nlp/updateuser.php on line 218
При выводе echo $immin получается avatarsmin/20150611171008525
но самого изображения в папке нет не могу понять в какую сторону копать
0
11.06.2015, 19:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.06.2015, 19:16
Помогаю со студенческими работами здесь

Открытие изображения в полном размере в новом окне. HTML
Вобщем приведу строку из учебника: Чтобы картинка (или любой другой файл-документ) открылась в...

создание контура изображения с последующим его преобразованием
1)Может кто помочь ссылкой на книгу/статью в которой подробно описывается создание контура. 2) а...

Реализовать класс позволяющий получать информацию о размере изображения из имени файла
Реализовать класс, позволяющий получать информацию о размере изображения в BMP-файле с последующим...

Неверное отображение уменьшенной копии изображения
Здравствуйте люди добрые и умные! Движок ДЛЕ 9.8, при добавлении изображения (к примеру 2000*1500)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru