X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> PHP / GD Уменьшение размеров больших загруженных фото
thesat
thesat
Topic Starter сообщение 28.10.2011, 15:23; Ответить: thesat
Сообщение #1


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

Почти всё это сделал, работает как мне нужно. Теперь вот столкнулся с проблемой. Загружаем фото весом 1,5мб (4608х3072) - при создании временной картинки в буфере возникает ошибка:
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 18432 bytes) in /var/www/......./admin/photo.php on line 111
строка 111: [PHP]$tmpimage = imagecreatefromjpeg($_FILES['image']['tmp_name']);[/PHP]
Как я понимаю, создается в оперативке картинка, прочитанная из исходного файла, но в режиме RGB, т.е. без сжатия и весом ~50мб, в то время как мой лимит ресурса сервера 64мб (не уверен).
Кто знает, подскажите, верно ли я всё понял и какие есть варианты решить задачу? Или есть ли способ на клиентской стороне проверить размеры и вес файла, желательно без JQ.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
Witu
сообщение 28.10.2011, 18:44; Ответить: Witu
Сообщение #2


картинка весом 1.5 мегабайта никак не может вызвать такую проблему если доступно 64 оперативки...

полный код в студию
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Cristian
Cristian
сообщение 28.10.2011, 19:21; Ответить: Cristian
Сообщение #3


HTMLandPHP, а что, размер изображения в памяти зависит от веса файла?
32-х битный jpeg с разрешением 4608х3072, займет ~57мб. Плюс накладные расходы на хранение, плюс другие данные скрипта. Так что, все очень может быть.


thesat, можно предварительно проверить размер изображения функцией getimagesize.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
thesat
thesat
Topic Starter сообщение 28.10.2011, 20:07; Ответить: thesat
Сообщение #4


(HTMLandPHP @ 28.10.2011, 21:44) *
картинка весом 1.5
Поясню, картинка - фотография в формате JPEG, т.е. имеющая сжатие, ее размеры 4608х3072рх. А функция imagecreatefromjpeg() как я понял, создает проекцию изображения без сжатия, вот в чем смысл.

(Cristian @ 28.10.2011, 22:21) *
Плюс накладные расходы на хранение, плюс другие данные скрипта.
Да да, и я о том же! Ведь в оперативке не только картинка.

Вот моя функция обработки (сильно не пинайте, только осваиваю графику):
[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
Cristian
сообщение 28.10.2011, 20:32; Ответить: Cristian
Сообщение #5


Так а вы чего хотите то? У вас на сервере не хватает памяти для обработки больших изображений. Я вижу два варианта решения проблемы:
- увеличить лимит памяти
- перед ресайзом проверить размер изображения. Если оно больше, чем может обработать сервер - выдать ошибку.

Еще один вариант, который, так или иначе, приводит ко второму, это делать ресайз на клиенте с помощью flash или html5.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
thesat
thesat
Topic Starter сообщение 28.10.2011, 21:26; Ответить: thesat
Сообщение #6


Cristian, да, всё верно, спасибо вам.
Но я думал, вдруг можно как-то пойти по другому пути, не загружая исходное фото, создать уменьшенную копию "на лету". Flash и HTML5 не подходит мне пока. Хостинг подороже (ради одной второстепенной функции) мне тоже пока ни к чему. Остается только высчитывать "жилплощадь" для загружаемых фотографий и выводить пользователю "пичальку". Еще хочу на самой форме попробовать сделать ограничение на размер загружаемого файла, почитаю насчет вот этого (первый пример).
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Apay
Apay
сообщение 28.10.2011, 21:57; Ответить: Apay
Сообщение #7


(thesat @ 29.10.2011, 00:26) *
Еще хочу на самой форме попробовать сделать ограничение на размер загружаемого файла
а смысл? все равно надо ограничивать по размеру картинки, а он с размером файла в jpeg слабо коррелирует (при нефиксированной степени сжатия)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
thesat
thesat
Topic Starter сообщение 28.10.2011, 22:08; Ответить: thesat
Сообщение #8


Apay, это да, но хотя бы пользователь не будет ждать полной загрузки большого файла, чтобы в итоге получить сообщение что файл не был загружен. Я думаю целесообразно установить лимит на вес фото в 1Мб (если прикинуть среднее сжатие), а уж если изображение уже загружено, тогда мерять рулеткой его площадь. Кроме того некоторые пишут, что даже в браузерах Опера и IE загрузка отсекается уже на стороне клиента, т.е. браузер не отсылает файл из формы, превышающий ограничение размера MAX_FILE_SIZE. Сам еще не тестировал.
Вообще я делаю это не как защиту, а как удобство пользователям.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
zabmix
zabmix
сообщение 29.10.2011, 6:52; Ответить: zabmix
Сообщение #9


В интернете должны быть Flash исходники. Скрипт в котором загружает фото на север, но прежде её уменьшает до такого то размера/качества - делается это на стороне клиента, еще сам не искал, но в контакте загрузчик именно таким образом устроен.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Witu
Witu
сообщение 29.10.2011, 9:41; Ответить: Witu
Сообщение #10


thesat, раз у вас картинка сжирает столько памяти то вас спасет перевод в GIF формат или уменьшение качества
качество останется примерно такое же но памяти примерно в 2.5 раза будет меньше съедать
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) EZmob - качественный трафик в больших количествах, по всему миру!
Self-serve рекламная сеть
12 Ruslan_EZmob 4183 13.3.2024, 14:31
автор: Ruslan_EZmob
Открытая тема (нет новых ответов) 📌 Рандомизация видео/аудио/фото/текста с минимальным участием - 𝓓𝓮𝓵𝓽𝓪𝓣𝓸𝓸𝓵𝓼
Мы предлагаем комплексное решение для рандомизации всех видов офера
2 leviathan 1375 29.1.2024, 21:29
автор: leviathan
Открытая тема (нет новых ответов) СОЗДАНИЕ : / САЙтЫ / ЛЕНДЫ / БОТЫ ТГ / ВАЙТЫ / КРЕО / СОФТЫ / ДИЗАЙН [PHP, JS, HTML/CSS] и другое
5 CULA 3388 19.12.2023, 18:55
автор: CULA
Открытая тема (нет новых ответов) Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery
Разработка сайтов и сервисов под-ключ
0 alexey 1237 24.11.2023, 14:46
автор: alexey
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыВеб-разработка (HTML5, CSS3, JavaScript, jQuery, Ajax, PHP)
56 qpPeW 44890 19.7.2023, 10:03
автор: qpPeW


 



RSS Текстовая версия Сейчас: 17.4.2024, 1:29
Дизайн