Помощник
|
PHP / GD Уменьшение размеров больших загруженных фото |
thesat
|
Сообщение
#1
|
||
|
|
||
|
|||
Witu |
28.10.2011, 18:44;
Ответить: Witu
Сообщение
#2
|
|
картинка весом 1.5 мегабайта никак не может вызвать такую проблему если доступно 64 оперативки...
полный код в студию |
|
|
Cristian |
28.10.2011, 19:21;
Ответить: Cristian
Сообщение
#3
|
|
HTMLandPHP, а что, размер изображения в памяти зависит от веса файла?
32-х битный jpeg с разрешением 4608х3072, займет ~57мб. Плюс накладные расходы на хранение, плюс другие данные скрипта. Так что, все очень может быть. thesat, можно предварительно проверить размер изображения функцией getimagesize. |
|
|
thesat
|
Сообщение
#4
|
|
картинка весом 1.5 Поясню, картинка - фотография в формате JPEG, т.е. имеющая сжатие, ее размеры 4608х3072рх. А функция imagecreatefromjpeg() как я понял, создает проекцию изображения без сжатия, вот в чем смысл.Плюс накладные расходы на хранение, плюс другие данные скрипта. Да да, и я о том же! Ведь в оперативке не только картинка.Вот моя функция обработки (сильно не пинайте, только осваиваю графику): [PHP]function newphoto() { global $_POST,$phototable; $addtime = time(); if (is_uploaded_file($_FILES['image']['tmp_name'])) { $srcimg = $_SERVER['DOCUMENT_ROOT']."/photo/$addtime".".jpg"; //путь к загруженному фото $thumb = $_SERVER['DOCUMENT_ROOT']."/photo/$addtime"."s.jpg"; //путь к эскизу copy ($_FILES['image']['tmp_name'], $srcimg); //копируем загруженный файл в папку $tmpimage = imagecreatefromjpeg($_FILES['image']['tmp_name']); //создаем проекцию исходного фото для обработки. ЗДЕСЬ ФАТАЛЬНАЯ ОШИБКА $tmpthumb = imagecreatetruecolor(120,90); //создаем заготовку для эскиза $width = imagesx($tmpimage); //получаем ширину $height = imagesy($tmpimage); //получаем высоту $vert = $height > $width; //получаем расположение фото $samp = ($vert) ? floor($width / 4) : floor($height / 3); //получаем множитель соотношения $tmpw = $samp * 4; //ширина полотна $tmph = $samp * 3; //высота полотна $tmpy = ($vert) ? ((floor($height/2))-(ceil($tmph/2))) : 0; //положение полотна Y $tmpx = ($vert) ? 0 : ((floor($width/2))-(ceil($tmpw/2))); //положение полотна X imagecopyresampled ($tmpthumb,$tmpimage,0,0,$tmpx,$tmpy,120,90,$tmpw,$tmph); //вырезка и проекция эскиза imagejpeg($tmpthumb, $thumb); //выгрузка эскиза в папку imagedestroy($tmpimage); //освобождение imagedestroy($tmpthumb); //освобождение } } [/PHP] Поясню, код немного отличается от условий в первом посте, загруженный файл сохраняется прямо в папку. |
|
|
Cristian |
28.10.2011, 20:32;
Ответить: Cristian
Сообщение
#5
|
|
Так а вы чего хотите то? У вас на сервере не хватает памяти для обработки больших изображений. Я вижу два варианта решения проблемы:
- увеличить лимит памяти - перед ресайзом проверить размер изображения. Если оно больше, чем может обработать сервер - выдать ошибку. Еще один вариант, который, так или иначе, приводит ко второму, это делать ресайз на клиенте с помощью flash или html5. |
|
|
thesat
|
Сообщение
#6
|
|
Cristian, да, всё верно, спасибо вам.
Но я думал, вдруг можно как-то пойти по другому пути, не загружая исходное фото, создать уменьшенную копию "на лету". Flash и HTML5 не подходит мне пока. Хостинг подороже (ради одной второстепенной функции) мне тоже пока ни к чему. Остается только высчитывать "жилплощадь" для загружаемых фотографий и выводить пользователю "пичальку". Еще хочу на самой форме попробовать сделать ограничение на размер загружаемого файла, почитаю насчет вот этого (первый пример). |
|
|
Apay |
28.10.2011, 21:57;
Ответить: Apay
Сообщение
#7
|
|
|
|
|
thesat
|
Сообщение
#8
|
|
Apay, это да, но хотя бы пользователь не будет ждать полной загрузки большого файла, чтобы в итоге получить сообщение что файл не был загружен. Я думаю целесообразно установить лимит на вес фото в 1Мб (если прикинуть среднее сжатие), а уж если изображение уже загружено, тогда мерять рулеткой его площадь. Кроме того некоторые пишут, что даже в браузерах Опера и IE загрузка отсекается уже на стороне клиента, т.е. браузер не отсылает файл из формы, превышающий ограничение размера MAX_FILE_SIZE. Сам еще не тестировал.
Вообще я делаю это не как защиту, а как удобство пользователям. |
|
|
zabmix |
29.10.2011, 6:52;
Ответить: zabmix
Сообщение
#9
|
|
В интернете должны быть Flash исходники. Скрипт в котором загружает фото на север, но прежде её уменьшает до такого то размера/качества - делается это на стороне клиента, еще сам не искал, но в контакте загрузчик именно таким образом устроен.
|
|
|
Witu |
29.10.2011, 9:41;
Ответить: Witu
Сообщение
#10
|
|
thesat, раз у вас картинка сжирает столько памяти то вас спасет перевод в GIF формат или уменьшение качества
качество останется примерно такое же но памяти примерно в 2.5 раза будет меньше съедать |
|
|
|
Похожие темы
Тема | Ответов | Автор | Просмотров | Последний ответ | |
---|---|---|---|---|---|
📌 Рандомизация видео/аудио/фото/текста с минимальным участием - 𝓓𝓮𝓵𝓽𝓪𝓣𝓸𝓸𝓵𝓼 Мы предлагаем комплексное решение для рандомизации всех видов офера |
3 | leviathan | 1539 | 24.4.2024, 19:39 автор: leviathan |
|
EZmob - качественный трафик в больших количествах, по всему миру! Self-serve рекламная сеть |
13 | Ruslan_EZmob | 4349 | 23.4.2024, 14:18 автор: Ruslan_EZmob |
|
СОЗДАНИЕ : / САЙтЫ / ЛЕНДЫ / БОТЫ ТГ / ВАЙТЫ / КРЕО / СОФТЫ / ДИЗАЙН [PHP, JS, HTML/CSS] и другое | 5 | CULA | 3429 | 19.12.2023, 18:55 автор: CULA |
|
Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery Разработка сайтов и сервисов под-ключ |
0 | alexey | 1246 | 24.11.2023, 14:46 автор: alexey |
|
Веб-разработка (HTML5, CSS3, JavaScript, jQuery, Ajax, PHP) | 56 | qpPeW | 44948 | 19.7.2023, 10:03 автор: qpPeW |
Текстовая версия | Сейчас: 26.4.2024, 2:35 |