Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: обработка фото юзеров
 
 автор: M0RE   (03.05.2009 в 17:11)   письмо автору
 
 

прошу помочь, умные люди:
есть скрипт, уменьшающий фотки, загружаемые юзерами (мах 800 и 1200 по ширине и высоте). вроде работает. однако, когда фотки грузят примерно >2...3 тысяч, то выдаются ошибки типа:
PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 10344 bytes) in .../imageload.php on line 57
вопросы - как переделать, чтобы:
1. ЛЮБЫЕ их фотки были не больше 800 ширины и 1200 высоты.
2. уменьшалась (в 800х1200) только копия, на которую лепится лого для публикации, а оригинал оставался на месте со своим названием (или с другим, неважно).
3. маленькая (тумба) чтобы делалась из оригинальной фотки, а не из той, на которую налепили лого.
3.1. (ну это вряд ли, но все же....) - как существенно повысить качество маленькой фотки (тумбы)? патронов не жалея, загрузкой сервака не заботясь...
вкраце в итоге хочу получить:
опубликованные фотки (с лого) не более 800х1200;
оригинальные фотки в папке юзера;
уменьшенные с оригиналов тумбы в соотв. папке
(и макс. лучшего качества, если можно).
сорри, если много хочу...))

спасибо!


<?php
    
if (file_exists($_FILES['imagefoto']["tmp_name"]))
      {
          if (
$userprava==3$togetuser=$_GET['selectedusername'];
        if (
$userprava==1$togetuser=$_COOKIE['login'];

          if (!
is_dir("img/fot/".$togetuser)) !mkdir("img/fot/".$togetuser0700);
          if (!
is_dir("img/fot/".$togetuser."/!thumbs")) !mkdir("img/fot/".$togetuser."/!thumbs"0700);
          if (!
is_dir("img/fot/".$togetuser."/!smal")) !mkdir("img/fot/".$togetuser."/!smal"0700);

        
$startimagecount=scandir("img/fot/".$togetuser."/");
        
$startimagecount=count($startimagecount)-3;
        
$imgfilename="img/fot/".$togetuser."/".$_POST['imgnum_ank'].".jpg";
        
$imgfilenamethumb="img/fot/".$togetuser."/!thumbs/".$_POST['imgnum_ank'].".jpg";

        
copy($_FILES['imagefoto']["tmp_name"], $imgfilename);
        
// размеры маленьких картинок
        
$widthlittle=150;
        
$heigthlittle=112;

        
$t=getimagesize ($imgfilename) or die('Unknown type of image');
        
$with=$t[0];$height=$t[1];
        if (
$with>$height)
        {
            if (
$with>800)
                {
                    
$rwith=800$rheight=$rwith*($height/$with);
                    
$widthlittle=150$heigthlittle=$widthlittle*($height/$with);
                }
                else
                {
                    
$rwith=$with;
                    
$rheight=$height;
                    
$widthlittle=150$heigthlittle=$widthlittle*($height/$with);
                }
            
$img=imagecreatefromjpeg($imgfilename);
            
$thumb=imagecreatetruecolor($rwith,$rheight);
            
$thumblittle=imagecreatetruecolor($widthlittle,$heigthlittle);
            
$imglogo=imagecreatefrompng("img/imagelogo.png");
            
imagecopyresized($thumb,$img,0,0,0,0,$rwith,$rheight,$with,$height);
            
imagecopyresized($thumblittle,$img,0,0,0,0,$widthlittle,$heigthlittle,$with,$height);
            
imagecopy($thumb,$imglogo,5,$rheight-150,0,0,1,1);
        }
        else
        {
            if (
$height>1200)
                {
                    
$rheight=1200$rwith=$rheight/($height/$with);
                    
$heigthlittle=112$widthlittle=$heigthlittle/($height/$with);
                }
                else
                {
                    
$rwith=$with$rheight=$height;
                    
$heigthlittle=112$widthlittle=$heigthlittle/($height/$with);
                }

            
$img=imagecreatefromjpeg($imgfilename);
            
$thumb=imagecreatetruecolor($rwith,$rheight);
            
$thumblittle=imagecreatetruecolor($widthlittle,$heigthlittle);
            
$imglogo=imagecreatefrompng("img/imagelogo.png");
            
imagecopyresized($thumb,$img,0,0,0,0,$rwith,$rheight,$with,$height);
            
imagecopyresized($thumblittle,$img,0,0,0,0,$widthlittle,$heigthlittle,$with,$height);
            
imagecopy($thumb,$imglogo,5,$rheight-150,0,0,1,1);
        }

        
imagejpeg($thumb$imgfilename98);
        
imagejpeg($thumblittle$imgfilenamethumb98);
    }

?>

  Ответить  
 
 автор: cheops   (04.05.2009 в 12:45)   письмо автору
 
   для: M0RE   (03.05.2009 в 17:11)
 

>1. ЛЮБЫЕ их фотки были не больше 800 ширины и 1200 высоты.
Так вот же у вас ширина и высота $with=$t[0];$height=$t[1]; - сравнивайте их с 1200 и 800 - если обнаруженое изображение больше - выводите предупреждение и останавливайте работу скрипта.
>2. уменьшалась (в 800х1200) только копия, на которую лепится лого для публикации, а
>оригинал оставался на месте со своим названием (или с другим, неважно).
Скопировать файл удобно при помощи функции copy()
>3.1. (ну это вряд ли, но все же....) - как существенно повысить качество маленькой фотки
>(тумбы)? патронов не жалея, загрузкой сервака не заботясь...
А почему у вас третий параметр функции imagejpeg() 98, а не 100. Конечно, 2% качества погоды не сделают, но все же...

  Ответить  
 
 автор: M0RE   (04.05.2009 в 16:31)   письмо автору
 
   для: cheops   (04.05.2009 в 12:45)
 

1. надо не остановить скрипт, а чтобы он уменьшил их до максимально допустимых размеров.
2. не могли бы вы подсказать, как все это написать с "copy()" ?
3.1. я пробовал 100. объем вырастает на 15-40%, а их много на странице... не вариант, увы.
спасибо!

  Ответить  
 
 автор: serjinio   (04.05.2009 в 19:24)   письмо автору
 
   для: M0RE   (04.05.2009 в 16:31)
 

 imagejpeg($thumb, $imgfilename, 98); 

можете сделать 50 качество особо не изменится а объем существенно уменьшится

if (copy($_FILES['image']['tmp_name'], "files/".$img))
{
unlink($_FILES['image']['tmp_name']);// Уничтожаем файл во временной директории
chmod($img, 0644);// Изменяем права доступа к файлу
}

вы забыли про очистку памяти imagedestroy($img);

  Ответить  
 
 автор: sim5   (04.05.2009 в 19:48)   письмо автору
 
   для: serjinio   (04.05.2009 в 19:24)
 

Сколько раз повторять - copy($_FILES['image']['tmp_name'], "files/".$img) - не делать этого, а использовать move_uploaded_file, и из временной папки файл будет удален.
И imagecopyresampled().

  Ответить  
 
 автор: serjinio   (04.05.2009 в 21:02)   письмо автору
 
   для: sim5   (04.05.2009 в 19:48)
 

Совершенно согласен ..но попросили использовать copy()

  Ответить  
 
 автор: Trianon   (04.05.2009 в 21:05)   письмо автору
 
   для: serjinio   (04.05.2009 в 21:02)
 

но не над $_FILES['image']['tmp_name'] же!

  Ответить  
 
 автор: AcidTrash   (04.05.2009 в 21:47)   письмо автору
 
   для: Trianon   (04.05.2009 в 21:05)
 

но не над $_FILES['image']['tmp_name'] же!
Интересно почему?

  Ответить  
 
 автор: sim5   (05.05.2009 в 04:54)   письмо автору
 
   для: AcidTrash   (04.05.2009 в 21:47)
 

Не стоит использовать copy при закачке файлов. Сopy вообще не будет работать при включенном open_basedir. При safe_mode=оn, чтобы использовать copy, нужно установить на временную папку того же владельца, что и выполняет скрипт, то есть аплоад будет невозможно делать, если у вас несколько пользователей (как и должно быть в случае виртуальных доменов). Сopy не выполняет проверку файла на существование. Сopy использовалась в версии РНР3, начиная с версии 4 нужно использовать move_uploaded_file.

  Ответить  
 
 автор: M0RE   (07.05.2009 в 00:10)   письмо автору
 
   для: sim5   (05.05.2009 в 04:54)
 

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

  Ответить  
 
 автор: ~~   (07.05.2009 в 00:14)
 
   для: M0RE   (07.05.2009 в 00:10)
 

которая называется его логином

Называйте папку, совпадающую с идентификатором юзера (id). С логином проблем огребёте.

  Ответить  
 
 автор: sim5   (07.05.2009 в 05:03)   письмо автору
 
   для: M0RE   (07.05.2009 в 00:10)
 

Сервер загружает изображение не в папку изера, а во временную папку указанную в переменных окружения сервера, и ваша задача переместить изображение из временной папки в папку изера. Если вы не переместите этот файл из временной папки, то сервер его удалит.
Сделать малую копию изображения можно непосредственно при загрузке файла на сервер, и проверять на допустимые размеры нужно тоже во время загрузки.

  Ответить  
 
 автор: M0RE   (07.05.2009 в 16:36)   письмо автору
 
   для: sim5   (07.05.2009 в 05:03)
 

ща так и есть.
но из-за дрянного качества тумб я отключил паст лого, ручками ковыряю тумбы из оригиналов, сам клею лого и обратно все на сервер... ((

2 Николай2357 лс отправил

  Ответить  
 
 автор: sim5   (07.05.2009 в 17:24)   письмо автору
 
   для: M0RE   (07.05.2009 в 16:36)
 

А вы думаете, если вы будете брать оригал не во время загрузки, а уже закачанный, то качество улучшится?

  Ответить  
 
 автор: M0RE   (09.05.2009 в 06:12)   письмо автору
 
   для: sim5   (07.05.2009 в 17:24)
 

если честно - не знаю. просто хотел попробовать (на других сайтах как-то же делают маленькие фотки приличного качества! а у меня прям отвратно все...)

  Ответить  
 
 автор: sim5   (09.05.2009 в 06:38)   письмо автору
 
   для: M0RE   (09.05.2009 в 06:12)
 

Картинка она и в Африке картинка. Если при загрузке вы помещаете ее в папку не изменяя, то это тоже самое, ну а, если уменьшаете при этом, то еще хуже. Неужели это не понятно?

  Ответить  
 
 автор: Николай2357   (07.05.2009 в 17:29)   письмо автору
 
   для: M0RE   (07.05.2009 в 16:36)
 

Чёт не получил я сообщения. Вот тут посмотрите, правда логотип я отключил, так как ограничение на сервере. Если понравится, я в скайпе.

  Ответить  
 
 автор: M0RE   (09.05.2009 в 06:20)   письмо автору
18.8 Кб
 
   для: Николай2357   (07.05.2009 в 17:29)
 

(я вам даже два отправил. может, из-за того, что у меня тут имейла нет? я забыл при регистрации, а теперь не знаю, как вставить... tender гав front.ru)
я посмотрел, понравилось, принимает и gif тоже, но странно - одну картинку упорно не хочет принимать! а я уж не стал тестировать по многим.
попробуйте сами разобраться, что за глюк, картинка-то самая обычная - посылаю.

и еще я не понял, странно - горизонтальная фотка в превьюшке просто обрезается по бокам - разве так сгодится? а вот "с лого" нормально уменьшилась...
а если юзер заливает совсем маленькую фотку, то "с лого" она увеличивается(!), а превьюшку не показывает.
скайпа нет у меня ,если можно отправьте на почту, плиз, может, я смогу вписать его как-то...
спасибо

  Ответить  
 
 автор: Николай2357   (09.05.2009 в 10:38)   письмо автору
 
   для: M0RE   (09.05.2009 в 06:20)
 

Этот класс я писал для своих нужд, он работает так: загружает любое к-во файлов одновременно, делает из них уменьшенные копии по заданным размерам, где соблюдаются пропоции, но ни ширина, ни высота не могут превысить допустимых. Из этого уменьшенного изображения вырезает середину, что бы превью всегда были одного размера. На любое изображение или все вместе накладывает логотип. Впринципе настроить его не сложно, можно подогнать и под Ваши требования. Берет он любые форматы, .gif , .jpeg, .png но пережимает се в .jpg Сейчас настроено так, что он исходник тоже уменьшает до заданных размеров.
Ошибку с Вашей картинкой исправил, теперь грузится.
Письма ни одного я не получил, стучите в скайп.

PS На счёт того, что увеличивается маленькая картинка, можно настроить минимальные допустимые размеры. Вот сейчас я это сделал.

  Ответить  
 
 автор: Николай2357   (07.05.2009 в 15:10)   письмо автору
 
   для: M0RE   (07.05.2009 в 00:10)
 

У меня есть что то очень похожее. Если еще есть нужда - стучите в личку.

  Ответить  
 
 автор: neadekvat   (07.06.2009 в 22:32)   письмо автору
 
   для: sim5   (04.05.2009 в 19:48)
 

Ваши бы слова да создателям справочников в уши.
Например, на сайте php.su везде используется copy, на move_uploaded_file вышел только через гугл, скопировав название из вашего поста..

  Ответить  
 
 автор: M0RE   (09.05.2009 в 06:21)   письмо автору
 
   для: M0RE   (03.05.2009 в 17:11)
 

С ПРАЗДНИКОМ ВСЕХ ВАС, ДОРОГИЕ ДРУЗЬЯ!!!

  Ответить  
 
 автор: anwor   (07.06.2009 в 22:21)   письмо автору
 
   для: M0RE   (03.05.2009 в 17:11)
 

Случайно наткнулся на эту тему. Несмотря на то что она уже слегка устарела, не могу удержаться и не прокомментировать, т.к. сам напарывался на грабли с функцией imagecopyresized. Используйте вместо нее imagecopyresampled (с теми же самыми параметрами) и получите качественно другой результат.

  Ответить  
 
 автор: Zilog   (08.06.2009 в 00:39)   письмо автору
 
   для: anwor   (07.06.2009 в 22:21)
 

>Случайно наткнулся на эту тему. Несмотря на то что она уже слегка устарела, не могу удержаться и не прокомментировать, т.к. сам напарывался на грабли с функцией imagecopyresized. Используйте вместо нее imagecopyresampled (с теми же самыми параметрами) и получите качественно другой результат.

А ещё лучше заюзать библиотеку class.upload.php

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования