| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: разработка для Web > Физическое изменение фаула картинки при закачке |
| Автор: MaxPayne 18.10.2006, 16:53 | ||
Делаю скрипт для создания автоматизированного заноса новостей на сайт. Т.е. есть форма с полями + выбирается файл и все это подается на это скрипт (частичный код ниже). Картинки всегда JPG большого размера - нужно сделать чтобы картинки преобразовывались например в 300х300 с качеством 80 и в таком виде уже сохранялись на сервере.
Что нужно чтобы узнать размер картинки которая закачивается и как сделать чтобы она стала 300х300. (размер буду делать пропорциональным, но это уже не сложно, главное узнать начальный размер и как сделать еее нужного размера) |
| Автор: GoodBoy 18.10.2006, 17:19 | ||||
| Image::Magick тебя спасёт! :-))) Если картинка пропорциональна размеру 300х300, то вот так:
в общем случае:
|
| Автор: nitr 18.10.2006, 17:20 |
| поиск на форуме Image::Magick и GD так же можешь глянуть модули тут: http://search.cpan.org/~jcristy/PerlMagick-6.29/Magick.pm и http://search.cpan.org/~lds/GD-2.35/GD.pm в комплекте есть неплохие примеры ;) ... да и на форуме поиск замечательный... много способов выдаст... Добавлено @ 17:22 снова меня опередили MaxPayne, GoodBoy дал хороший пример , ну а поиском можешь найти пример с http://search.cpan.org/~lds/GD-2.35/GD.pm ;) |
| Автор: MaxPayne 19.10.2006, 09:06 | ||
При таком коде не выдает размеры картинки:
Выводит: File Image::Magick=ARRAY(0x812c254): x Поидее выводит что-то - значит модель установлен. |
| Автор: amg 19.10.2006, 09:44 | ||
Попробуй для начала
|
| Автор: GoodBoy 19.10.2006, 09:55 |
| MaxPayne, почитай доки к модулю... У тебя может быть более новая версия, чем та, что юзал я... |
| Автор: MaxPayne 20.10.2006, 08:30 | ||||||
Код выводит: Exception 410: Must specify image size `\Documents and Settings\User\Рабочий стол\Новости\99.jpg' Куда то пропало С: Или сначала закачать, а потом его переделать? Пробовал подругому - брать уже выделенный файл
Тогда выводит Exception 435: unable to open image `99.jpg': No such file or directory |
| Автор: GoodBoy 20.10.2006, 15:45 |
| MaxPayne, как вариант: попробуй читать файл из папки C:\image. Т.е. чтобы в пути не было пробелов и не было русских букв. |
| Автор: nitr 20.10.2006, 16:22 |
| можно же прямо в каталог со скриптом в Винде путь - .\99.jpg В *nix путь - ./99.jpg А по-моему он закачивает на сервер файлик неверно ;) MaxPayne, я угадал? |
| Автор: MaxPayne 20.10.2006, 18:10 |
| Так в том то и фикус - новости добавляются на ура (astronews.ru), закачивается файл и добавляется в базу новость. Но проблема в том, что картинку приходится перед заливкой менть например с 1024х768, на 300х??? (пропорционально). Т.к. все идеально добавлялось решил еще больше упростить свою задачу, предварительно не уменьшать картинки, а заставить сделать это скрипт. МОжет так нельзя вообще? Может сначала нужно залить, потом открыть, подредактировать и перезаписать? МОжет на лету нельзя? |
| Автор: nitr 20.10.2006, 19:42 |
| MaxPayne, это как налету? залить - изменить - получаем всё ок |
| Автор: MaxPayne 20.10.2006, 22:13 | ||
| Получилось его открыть и узнать размеры, дальше нахожу коэффициент сжатия (по барабану какая сторона больше) $path$max = /home/www/htdocs/00000128.jpg
Но файл не изменился в размерах. |
| Автор: GoodBoy 23.10.2006, 10:44 |
| по-идее ты не можешь перезаписать открытый файл... |
| Автор: GoodBoy 24.10.2006, 10:30 |
Тьфу ты... Ну естественно!!!!! В одинарных у тебя переменные твои не интерполитовались!!!! |
| Автор: MaxPayne 24.10.2006, 13:04 | ||
Все заработало - файлы сжимает пропорционально до 300 по ширине, а если начальная картинка по ширине меньше 300, то увеличивает ее до 300. Привожу кратко код - может кому пригодится. Всем еще раз спасибо.
|
| Автор: Zuzu 24.10.2006, 14:11 | ||||
| Можно пару комментариев, если позволите. Просто участвую в написании "каталога фотографий" примерно с таким-же количеством (расчетное количество - в районе миллиона фото + всякая мелочь к фото типа структурированного адреса, ключевых слов, описания, маленькой фото, датой съемки, датой обновления, кто из администраторов обновил и т.д.). Чур, не обижаться! Скрипт-то работает. 0. use strict; лучше поставить сверху. Как-то привычнее с ней =) 1. Строчку с Crop можно убрать - она просто лишняя! 2. Метод поиска максимального номера файла - сомнителен. При большом количестве файлов задержка будет увеличиваться! Насколько я понял, задача в определении имени нового файла. Я бы воспользовался для определения имени файла либо MySQL (LAST_INSERT_ID) либо формировал временное имя случайным образом. С MySQL, естественно, нужно сначала добавить запись в таблицу news и при наличии в news поля со свойствами авто-инкремента, считать новый номер. Кстати, есть ли там такое поле? =) А как тогда обратится к строке с новостью? Соответственно, всё, что связано с чтением файлов из каталога и увеличением номера файла можно убрать, можно не хранить имя файла - его имя (<номер>.jpg) будет совпадать с id строки новости.
P.S. Добавление нулями слева (если уж оно нужно) проще написать так:
P.P.S. Нет ни одной обработки "плохой ситуации". Типа скрипт всегда работает в идеальных условиях. И ни одной проверки целостности и правильности данных при вводе, результатов при обработке, при записи... Работаем все-таки в CGI-среде! Всюду враги! |
| Автор: MaxPayne 24.10.2006, 15:07 | ||
| 1) По поводу добаления нулей слева - спасибо. Переправил. 2) Программа работает в идеальных условиях, т.к. новости добавляю я сам, хотя попозже сделаю добавление сторонними людьми (с Логином и паролем), соответственно добавлю и проверки. 3) Что касается id файла = id новости, можно и так, просто новости идут с 2003 года, примерно по 1-2 новости в день - файлов получается немного (разбиты по папкам /2003/ ), пока нет необходимости делать как вы сказали. Хотя вопрос интересный, может со временем так и сделаем. 4)
Убрал, просто не знал что она не нужна. |
| Автор: amg 24.10.2006, 16:05 | ||||||||||
| Победителей не судят, но попридиратся немного можно? Вместо длинного перечисления
|
| Автор: Zuzu 24.10.2006, 16:33 | ||||
$file=~/([^\\\/:]+)$/; # Так с переменной $file ничего не произойдет И слава богу, что не происходит ничего!!! С именем файла ничего делать не нужно, строка просто лишняя в этом коде! Я не заметил. Лично я использую upload() из CGI (см. perldoc CGI) По поводу
Код ИМХО потерял читабельность (нужно думать, что он делает, а сначала было все очевидно) и выполняться будет дольше. (возможность определения имени переменной с помощью подстановки расхолаживает + в foreach "поднимаются" некоторые структуры типа массива - дополнительные затраты ресурсов). А вообще любой код можно "вылизывать" до бесконечности. |
| Автор: MaxPayne 24.10.2006, 16:49 | ||
Я так понимаю что это код из c:/Document and settign/user/Рабочий стол/Новости/dfjsl.jpg выделяет именно dfjsl.jpg. Что в принципе и нужно для записи его уже в *nix систему. |
| Автор: Zuzu 24.10.2006, 17:46 | ||||
Редко использую регулярные выражения, поэтому поправьте, если что не так =) Нет. Он смотрит наличие на хвосте строкИ наличие нескольких (1 или более) идущих подряд символом, таких, чтобы они не попали во множество { \ / : } и заносит их в переменную $1, если найдет. Результат (нашли или нет) операции теряется. С $file ничего не происходит. Т.е. для строки $file="qqq/666\ddd:565ss"; $1 будет '565ss'. По поводу file и upload рекомендую почитать perldoc CGI, где (на чистом русском языке =) ) говорится, что при приеме файла с помощью param может произойти абсолютно любая лажа (slightly different things). Дальше говорится, что с именем файла ничего делать не нужно и приводится правильный способ приема файла с помощью upload(). И что ничего не нужно вырезать из имени, т.к. оно никак не связано (is unrelated) с реальным потоком данных, принимаемых посредством CGI =)
Рекомендую! Очень увлекательное чтиво! |
| Автор: gcc 25.4.2008, 19:19 | ||
| у меня тоже самое что у автора топика! только я бьюсь об стену пол дня, очень странная ошибка какая-то прямо аномалия!!! 1. передаються данные из формы в скрипт, все проходит хорошо. 2. Принимаеться функцей param() данные и файл, нужно сохранить один файл в раширении 150 на 150, другой 75 на 75 выходит ситуациия,что первый записыаеться нормально, а другой файл записываеться пустой!! права 777 права у веб сервера на всё! вот скрипт, менял его много раз подскжаите ошибка пожалуйста!
|
| Автор: gcc 25.4.2008, 21:58 |
| как всегда из-за тупой проблемы - тормоза, аж обидно |
| Автор: gcc 26.4.2008, 16:04 |
| что за факство!!!?? подскажите в чем проблема??? пробовал по разному!! |
| Автор: gcc 26.4.2008, 17:05 |
| по-моиму сделал... |
| Автор: MaxPayne 27.4.2008, 15:09 |
| gcc, Показывай как сделал. |
| Автор: gcc 27.4.2008, 22:13 | ||||
меняем на :
абяву забыл сделать |