![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| MaxPayne |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 9.8.2005 Репутация: нет Всего: нет |
Делаю скрипт для создания автоматизированного заноса новостей на сайт. Т.е. есть форма с полями + выбирается файл и все это подается на это скрипт (частичный код ниже). Картинки всегда JPG большого размера - нужно сделать чтобы картинки преобразовывались например в 300х300 с качеством 80 и в таком виде уже сохранялись на сервере.
Что нужно чтобы узнать размер картинки которая закачивается и как сделать чтобы она стала 300х300. (размер буду делать пропорциональным, но это уже не сложно, главное узнать начальный размер и как сделать еее нужного размера) |
|||
|
||||
| GoodBoy |
|
||||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 4 Всего: 83 |
Image::Magick тебя спасёт! :-)))
Если картинка пропорциональна размеру 300х300, то вот так:
в общем случае:
|
||||
|
|||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 12 Всего: 84 |
поиск на форуме 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 дал хороший пример , ну а поиском можешь найти пример с GD ;) |
|||
|
||||
| MaxPayne |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 9.8.2005 Репутация: нет Всего: нет |
При таком коде не выдает размеры картинки:
Выводит: File Image::Magick=ARRAY(0x812c254): x Поидее выводит что-то - значит модель установлен. |
|||
|
||||
| amg |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 1 Всего: 50 |
Попробуй для начала
|
|||
|
||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 4 Всего: 83 |
MaxPayne, почитай доки к модулю... У тебя может быть более новая версия, чем та, что юзал я...
|
|||
|
||||
| MaxPayne |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 9.8.2005 Репутация: нет Всего: нет |
Код выводит: 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 Это сообщение отредактировал(а) MaxPayne - 20.10.2006, 08:33 |
||||||
|
|||||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 4 Всего: 83 |
MaxPayne, как вариант: попробуй читать файл из папки C:\image. Т.е. чтобы в пути не было пробелов и не было русских букв.
|
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 12 Всего: 84 |
можно же прямо в каталог со скриптом
в Винде путь - .\99.jpg В *nix путь - ./99.jpg А по-моему он закачивает на сервер файлик неверно ;) MaxPayne, я угадал? |
|||
|
||||
| MaxPayne |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 9.8.2005 Репутация: нет Всего: нет |
Так в том то и фикус - новости добавляются на ура (astronews.ru), закачивается файл и добавляется в базу новость. Но проблема в том, что картинку приходится перед заливкой менть например с 1024х768, на 300х??? (пропорционально). Т.к. все идеально добавлялось решил еще больше упростить свою задачу, предварительно не уменьшать картинки, а заставить сделать это скрипт. МОжет так нельзя вообще?
Может сначала нужно залить, потом открыть, подредактировать и перезаписать? МОжет на лету нельзя? |
|||
|
||||
| nitr |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2543 Регистрация: 10.2.2006 Где: Россия :) Репутация: 12 Всего: 84 |
MaxPayne, это как налету?
залить - изменить - получаем всё ок |
|||
|
||||
| MaxPayne |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 9.8.2005 Репутация: нет Всего: нет |
Получилось его открыть и узнать размеры, дальше нахожу коэффициент сжатия (по барабану какая сторона больше)
$path$max = /home/www/htdocs/00000128.jpg
Но файл не изменился в размерах. |
|||
|
||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 4 Всего: 83 |
по-идее ты не можешь перезаписать открытый файл...
|
|||
|
||||
| Zuzu |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 1 Всего: 4 |
На лету, это значит не сохряняя промежуточный результат во временный файл. Судя по документации, должно работать (код, который написАл здесь даже не компилировал, заранее прошу прощения за возможные ошибки):
Ссылки на документацию: (http://www.imagemagick.org/script/perl-magick.php)
perldoc CGI
В чем же дело? Понятно, что проблема решена путем промежуточного сохранения в файл и чтения в дальнейшем из него. Вопрос академический, поэтому отдельную тему решил не создавать. Добавлено @ 16:00
Скорее всего, можно переписать существующий файл! Он ужЕ загружен в память! Может дело в "волшебных пузырьках"? Замени на двойные кавычки =)
=) Это сообщение отредактировал(а) Zuzu - 23.10.2006, 16:01 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
||||||||||
|
|||||||||||
| GoodBoy |
|
|||
![]() Главный джедай ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3886 Регистрация: 8.1.2003 Где: КМВ Репутация: 4 Всего: 83 |
Тьфу ты... Ну естественно!!!!! В одинарных у тебя переменные твои не интерполитовались!!!! |
|||
|
||||
| MaxPayne |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 9.8.2005 Репутация: нет Всего: нет |
Все заработало - файлы сжимает пропорционально до 300 по ширине, а если начальная картинка по ширине меньше 300, то увеличивает ее до 300. Привожу кратко код - может кому пригодится. Всем еще раз спасибо.
|
|||
|
||||
| Zuzu |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 1 Всего: 4 |
Можно пару комментариев, если позволите. Просто участвую в написании "каталога фотографий" примерно с таким-же количеством (расчетное количество - в районе миллиона фото + всякая мелочь к фото типа структурированного адреса, ключевых слов, описания, маленькой фото, датой съемки, датой обновления, кто из администраторов обновил и т.д.).
Чур, не обижаться! Скрипт-то работает. 0. use strict; лучше поставить сверху. Как-то привычнее с ней =) 1. Строчку с Crop можно убрать - она просто лишняя! 2. Метод поиска максимального номера файла - сомнителен. При большом количестве файлов задержка будет увеличиваться! Насколько я понял, задача в определении имени нового файла. Я бы воспользовался для определения имени файла либо MySQL (LAST_INSERT_ID) либо формировал временное имя случайным образом. С MySQL, естественно, нужно сначала добавить запись в таблицу news и при наличии в news поля со свойствами авто-инкремента, считать новый номер. Кстати, есть ли там такое поле? =) А как тогда обратится к строке с новостью? Соответственно, всё, что связано с чтением файлов из каталога и увеличением номера файла можно убрать, можно не хранить имя файла - его имя (<номер>.jpg) будет совпадать с id строки новости.
P.S. Добавление нулями слева (если уж оно нужно) проще написать так:
P.P.S. Нет ни одной обработки "плохой ситуации". Типа скрипт всегда работает в идеальных условиях. И ни одной проверки целостности и правильности данных при вводе, результатов при обработке, при записи... Работаем все-таки в CGI-среде! Всюду враги! Это сообщение отредактировал(а) Zuzu - 24.10.2006, 14:14 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
||||
|
|||||
| MaxPayne |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 9.8.2005 Репутация: нет Всего: нет |
1) По поводу добаления нулей слева - спасибо. Переправил.
2) Программа работает в идеальных условиях, т.к. новости добавляю я сам, хотя попозже сделаю добавление сторонними людьми (с Логином и паролем), соответственно добавлю и проверки. 3) Что касается id файла = id новости, можно и так, просто новости идут с 2003 года, примерно по 1-2 новости в день - файлов получается немного (разбиты по папкам /2003/ ), пока нет необходимости делать как вы сказали. Хотя вопрос интересный, может со временем так и сделаем. 4)
Убрал, просто не знал что она не нужна. |
|||
|
||||
| amg |
|
||||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1145 Регистрация: 3.8.2006 Где: Новосибирск Репутация: 1 Всего: 50 |
Победителей не судят, но попридиратся немного можно?
Вместо длинного перечисления
|
||||||||||
|
|||||||||||
| Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 1 Всего: 4 |
$file=~/([^\\\/:]+)$/; # Так с переменной $file ничего не произойдет И слава богу, что не происходит ничего!!! С именем файла ничего делать не нужно, строка просто лишняя в этом коде! Я не заметил. Лично я использую upload() из CGI (см. perldoc CGI) По поводу
Код ИМХО потерял читабельность (нужно думать, что он делает, а сначала было все очевидно) и выполняться будет дольше. (возможность определения имени переменной с помощью подстановки расхолаживает + в foreach "поднимаются" некоторые структуры типа массива - дополнительные затраты ресурсов). А вообще любой код можно "вылизывать" до бесконечности. --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
| MaxPayne |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 9.8.2005 Репутация: нет Всего: нет |
Я так понимаю что это код из c:/Document and settign/user/Рабочий стол/Новости/dfjsl.jpg выделяет именно dfjsl.jpg. Что в принципе и нужно для записи его уже в *nix систему. |
|||
|
||||
| Zuzu |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 140 Регистрация: 19.10.2006 Где: Екатеринбург Репутация: 1 Всего: 4 |
Редко использую регулярные выражения, поэтому поправьте, если что не так =) Нет. Он смотрит наличие на хвосте строкИ наличие нескольких (1 или более) идущих подряд символом, таких, чтобы они не попали во множество { \ / : } и заносит их в переменную $1, если найдет. Результат (нашли или нет) операции теряется. С $file ничего не происходит. Т.е. для строки $file="qqq/666\ddd:565ss"; $1 будет '565ss'. По поводу file и upload рекомендую почитать perldoc CGI, где (на чистом русском языке =) ) говорится, что при приеме файла с помощью param может произойти абсолютно любая лажа (slightly different things). Дальше говорится, что с именем файла ничего делать не нужно и приводится правильный способ приема файла с помощью upload(). И что ничего не нужно вырезать из имени, т.к. оно никак не связано (is unrelated) с реальным потоком данных, принимаемых посредством CGI =)
Рекомендую! Очень увлекательное чтиво! Это сообщение отредактировал(а) Zuzu - 24.10.2006, 17:53 --------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно. |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 2 Всего: 17 |
у меня тоже самое что у автора топика!
только я бьюсь об стену пол дня, очень странная ошибка какая-то прямо аномалия!!! 1. передаються данные из формы в скрипт, все проходит хорошо. 2. Принимаеться функцей param() данные и файл, нужно сохранить один файл в раширении 150 на 150, другой 75 на 75 выходит ситуациия,что первый записыаеться нормально, а другой файл записываеться пустой!! права 777 права у веб сервера на всё! вот скрипт, менял его много раз подскжаите ошибка пожалуйста!
Это сообщение отредактировал(а) gcc - 25.4.2008, 19:21 |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 2 Всего: 17 |
как всегда из-за тупой проблемы - тормоза, аж обидно
|
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 2 Всего: 17 |
что за факство!!!??
подскажите в чем проблема??? пробовал по разному!! |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 2 Всего: 17 |
по-моиму сделал...
|
|||
|
||||
| MaxPayne |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 9.8.2005 Репутация: нет Всего: нет |
gcc, Показывай как сделал.
|
|||
|
||||
| gcc |
|
||||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 2 Всего: 17 |
меняем на :
абяву забыл сделать |
||||
|
|||||
![]()
|
| Правила форума "Perl: CGI программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |