|
|
|
| прошу помочь, умные люди:
есть скрипт, уменьшающий фотки, загружаемые юзерами (мах 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/".$togetuser, 0700);
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, $imgfilename, 98);
imagejpeg($thumblittle, $imgfilenamethumb, 98);
}
?>
|
| |
|
|
|
|
|
|
|
для: 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% качества погоды не сделают, но все же... | |
|
|
|
|
|
|
|
для: cheops
(04.05.2009 в 12:45)
| | 1. надо не остановить скрипт, а чтобы он уменьшил их до максимально допустимых размеров.
2. не могли бы вы подсказать, как все это написать с "copy()" ?
3.1. я пробовал 100. объем вырастает на 15-40%, а их много на странице... не вариант, увы.
спасибо! | |
|
|
|
|
|
|
|
для: 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); | |
|
|
|
|
|
|
|
для: serjinio
(04.05.2009 в 19:24)
| | Сколько раз повторять - copy($_FILES['image']['tmp_name'], "files/".$img) - не делать этого, а использовать move_uploaded_file, и из временной папки файл будет удален.
И imagecopyresampled(). | |
|
|
|
|
|
|
|
для: sim5
(04.05.2009 в 19:48)
| | Совершенно согласен ..но попросили использовать copy() | |
|
|
|
|
|
|
|
для: serjinio
(04.05.2009 в 21:02)
| | но не над $_FILES['image']['tmp_name'] же! | |
|
|
|
|
|
|
|
для: Trianon
(04.05.2009 в 21:05)
| | но не над $_FILES['image']['tmp_name'] же!
Интересно почему? | |
|
|
|
|
|
|
|
для: AcidTrash
(04.05.2009 в 21:47)
| | Не стоит использовать copy при закачке файлов. Сopy вообще не будет работать при включенном open_basedir. При safe_mode=оn, чтобы использовать copy, нужно установить на временную папку того же владельца, что и выполняет скрипт, то есть аплоад будет невозможно делать, если у вас несколько пользователей (как и должно быть в случае виртуальных доменов). Сopy не выполняет проверку файла на существование. Сopy использовалась в версии РНР3, начиная с версии 4 нужно использовать move_uploaded_file. | |
|
|
|
|
|
|
|
для: sim5
(05.05.2009 в 04:54)
| | не знаю, важно ли это - юзер же загружает фотки в свою папку (которая называется его логином), т.е. он единственный там владелец... зачем еще временная и еще удаление файла?
возможно так? -
загружен в его папку оригинальный файл, с него делается маленькая копия в папку "thumb" и переименовывается.
а при запросе на показ этого файла на странице он проверяется на макс. размер (уменьшается, если надо), переименовывается (как и thumb) и на него лепится лого.
собственно, получается - копирование и удаление вовсе не нужно? | |
|
|
|
|
автор: ~~ (07.05.2009 в 00:14) |
|
|
для: M0RE
(07.05.2009 в 00:10)
| | которая называется его логином
Называйте папку, совпадающую с идентификатором юзера (id). С логином проблем огребёте. | |
|
|
|
|
|
|
|
для: M0RE
(07.05.2009 в 00:10)
| | Сервер загружает изображение не в папку изера, а во временную папку указанную в переменных окружения сервера, и ваша задача переместить изображение из временной папки в папку изера. Если вы не переместите этот файл из временной папки, то сервер его удалит.
Сделать малую копию изображения можно непосредственно при загрузке файла на сервер, и проверять на допустимые размеры нужно тоже во время загрузки. | |
|
|
|
|
|
|
|
для: sim5
(07.05.2009 в 05:03)
| | ща так и есть.
но из-за дрянного качества тумб я отключил паст лого, ручками ковыряю тумбы из оригиналов, сам клею лого и обратно все на сервер... ((
2 Николай2357 лс отправил | |
|
|
|
|
|
|
|
для: M0RE
(07.05.2009 в 16:36)
| | А вы думаете, если вы будете брать оригал не во время загрузки, а уже закачанный, то качество улучшится? | |
|
|
|
|
|
|
|
для: sim5
(07.05.2009 в 17:24)
| | если честно - не знаю. просто хотел попробовать (на других сайтах как-то же делают маленькие фотки приличного качества! а у меня прям отвратно все...) | |
|
|
|
|
|
|
|
для: M0RE
(09.05.2009 в 06:12)
| | Картинка она и в Африке картинка. Если при загрузке вы помещаете ее в папку не изменяя, то это тоже самое, ну а, если уменьшаете при этом, то еще хуже. Неужели это не понятно? | |
|
|
|
|
|
|
|
для: M0RE
(07.05.2009 в 16:36)
| | Чёт не получил я сообщения. Вот тут посмотрите, правда логотип я отключил, так как ограничение на сервере. Если понравится, я в скайпе. | |
|
|
|
|
 18.8 Кб |
|
|
для: Николай2357
(07.05.2009 в 17:29)
| | (я вам даже два отправил. может, из-за того, что у меня тут имейла нет? я забыл при регистрации, а теперь не знаю, как вставить... tender гав front.ru)
я посмотрел, понравилось, принимает и gif тоже, но странно - одну картинку упорно не хочет принимать! а я уж не стал тестировать по многим.
попробуйте сами разобраться, что за глюк, картинка-то самая обычная - посылаю.
и еще я не понял, странно - горизонтальная фотка в превьюшке просто обрезается по бокам - разве так сгодится? а вот "с лого" нормально уменьшилась...
а если юзер заливает совсем маленькую фотку, то "с лого" она увеличивается(!), а превьюшку не показывает.
скайпа нет у меня ,если можно отправьте на почту, плиз, может, я смогу вписать его как-то...
спасибо | |
|
|
|
|
|
|
|
для: M0RE
(09.05.2009 в 06:20)
| | Этот класс я писал для своих нужд, он работает так: загружает любое к-во файлов одновременно, делает из них уменьшенные копии по заданным размерам, где соблюдаются пропоции, но ни ширина, ни высота не могут превысить допустимых. Из этого уменьшенного изображения вырезает середину, что бы превью всегда были одного размера. На любое изображение или все вместе накладывает логотип. Впринципе настроить его не сложно, можно подогнать и под Ваши требования. Берет он любые форматы, .gif , .jpeg, .png но пережимает се в .jpg Сейчас настроено так, что он исходник тоже уменьшает до заданных размеров.
Ошибку с Вашей картинкой исправил, теперь грузится.
Письма ни одного я не получил, стучите в скайп.
PS На счёт того, что увеличивается маленькая картинка, можно настроить минимальные допустимые размеры. Вот сейчас я это сделал. | |
|
|
|
|
|
|
|
для: M0RE
(07.05.2009 в 00:10)
| | У меня есть что то очень похожее. Если еще есть нужда - стучите в личку. | |
|
|
|
|
|
|
|
для: sim5
(04.05.2009 в 19:48)
| | Ваши бы слова да создателям справочников в уши.
Например, на сайте php.su везде используется copy, на move_uploaded_file вышел только через гугл, скопировав название из вашего поста.. | |
|
|
|
|
|
|
|
для: M0RE
(03.05.2009 в 17:11)
| | С ПРАЗДНИКОМ ВСЕХ ВАС, ДОРОГИЕ ДРУЗЬЯ!!! | |
|
|
|
|
|
|
|
для: M0RE
(03.05.2009 в 17:11)
| | Случайно наткнулся на эту тему. Несмотря на то что она уже слегка устарела, не могу удержаться и не прокомментировать, т.к. сам напарывался на грабли с функцией imagecopyresized. Используйте вместо нее imagecopyresampled (с теми же самыми параметрами) и получите качественно другой результат. | |
|
|
|
|
|
|
|
для: anwor
(07.06.2009 в 22:21)
| | >Случайно наткнулся на эту тему. Несмотря на то что она уже слегка устарела, не могу удержаться и не прокомментировать, т.к. сам напарывался на грабли с функцией imagecopyresized. Используйте вместо нее imagecopyresampled (с теми же самыми параметрами) и получите качественно другой результат.
А ещё лучше заюзать библиотеку class.upload.php | |
|
|
|
|