Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Физическое изменение фаула картинки при закачке, PERL 
V
    Опции темы
MaxPayne
  Дата 18.10.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 9.8.2005

Репутация: нет
Всего: нет



Делаю скрипт для создания автоматизированного заноса новостей на сайт. Т.е. есть форма с полями + выбирается файл и все это подается на это скрипт (частичный код ниже). Картинки всегда JPG большого размера - нужно сделать чтобы картинки преобразовывались например в 300х300 с качеством 80 и в таком виде уже сохранялись на сервере.

Код

my $path="/home/www/htdocs/news/";
my $file=param('file');
my $file=~/([^\\\/:]+)$/;

open(FILE,">$path$file"); 
binmode(FILE);
print FILE <$file>;
close(FILE);

print header();
print start_html();
print "Content-type: text/plain\n\n";
print "Done";


Что нужно чтобы узнать размер картинки которая закачивается и как сделать чтобы она стала 300х300. (размер буду делать пропорциональным, но это уже не сложно, главное узнать начальный размер и как сделать еее нужного размера)
PM MAIL WWW ICQ   Вверх
GoodBoy
Дата 18.10.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 4
Всего: 83



Image::Magick тебя спасёт! :-)))

Если картинка пропорциональна размеру 300х300, то вот так:

Код
use Image::Magick;
my $image = Image::Magick->new;
$image->Read($filename);
$image->Scale(width=>"300", height=>"300");
$image->Write(filename=>$filename2, compression=>'JPEG', quality=>'80');



в общем случае:
Код
use Image::Magick;
my $image = Image::Magick->new;
$image->Read($filename);

my ($img_width, $img_height) = $image->Get('width', 'height');
my ($res_width, $res_width) = (300, 300);
my $scale_x = $img_width/$res_width;
my $scale_y = $img_height/$res_width;

if ($scale_x<$scale_y) {
    my $scale = $img_width/$res_width;
    $image->Scale(width=>$res_width, height=>int($img_height/$scale));
    my ($img_width, $img_height) = $image->Get('width', 'height');
    $image->Crop(width=>$res_width, height=>$res_height, x=>0, y=>int(($img_height-$res_height)/2));
} else {
    my $scale = $img_height/$res_height;
    $image->Scale(width=>int($img_width/$scale), height=>$res_height);
    my ($img_width, $img_height) = $image->Get('width', 'height');
    $image->Crop(width=>$res_width, height=>$res_height, x=>int(($img_width-$res_width)/2), y=>0);
}
$image->Write(filename=>$filename2, compression=>'JPEG', quality=>'80');



--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
nitr
Дата 18.10.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 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 
снова меня опередили smile ... плохо на работе сидеть ;)

MaxPayne,  GoodBoy дал хороший пример smile
, ну а поиском можешь найти пример с GD ;)


--------------------
PM   Вверх
MaxPayne
Дата 19.10.2006, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 9.8.2005

Репутация: нет
Всего: нет



При таком коде не выдает размеры картинки:

Код

my $image = Image::Magick->new;
$image->Read($max);

my ($img_width, $img_height) = $image->Get('width', 'height');

print "File $image: $img_width x $img_height<br>";


Выводит:
File Image::Magick=ARRAY(0x812c254): x 

Поидее выводит что-то - значит модель установлен.
PM MAIL WWW ICQ   Вверх
amg
Дата 19.10.2006, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 1
Всего: 50



Попробуй для начала 
Код
my $x = $image->Read($max);
print "$x<br>" if $x;
 чтобы узнать, успешно ли прочитался имидж
PM MAIL   Вверх
GoodBoy
Дата 19.10.2006, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 4
Всего: 83



MaxPayne, почитай доки к модулю...  У тебя может быть более новая версия, чем та, что юзал я...


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
MaxPayne
Дата 20.10.2006, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 9.8.2005

Репутация: нет
Всего: нет



Цитата(amg @ 19.10.2006,  10:44)
Попробуй для начала 
Код
my $x = $image->Read($max);
print "$x<br>" if $x;
 чтобы узнать, успешно ли прочитался имидж

Код выводит:
Exception 410: Must specify image size `\Documents and Settings\User\Рабочий стол\Новости\99.jpg'

Куда то пропало С:



Или сначала закачать, а потом его переделать? Пробовал подругому - брать уже выделенный файл
Код

$file=~/([^\\\/:]+)$/;

Тогда выводит
Exception 435: unable to open image `99.jpg': No such file or directory


Это сообщение отредактировал(а) MaxPayne - 20.10.2006, 08:33
PM MAIL WWW ICQ   Вверх
GoodBoy
Дата 20.10.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 4
Всего: 83



MaxPayne, как вариант: попробуй читать файл из папки C:\image. Т.е. чтобы в пути не было пробелов и не было русских букв.


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
nitr
Дата 20.10.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



можно же прямо в каталог со скриптом
в Винде путь - .\99.jpg
В *nix путь - ./99.jpg

А по-моему он закачивает на сервер файлик неверно ;) 
MaxPayne, я угадал?


--------------------
PM   Вверх
MaxPayne
Дата 20.10.2006, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 9.8.2005

Репутация: нет
Всего: нет



Так в том то и фикус - новости добавляются на ура (astronews.ru), закачивается файл и добавляется в базу новость. Но проблема в том, что картинку приходится перед заливкой менть например с 1024х768, на 300х??? (пропорционально). Т.к. все идеально добавлялось решил еще больше упростить свою задачу, предварительно не уменьшать картинки, а заставить сделать это скрипт. МОжет так нельзя вообще? 
Может сначала нужно залить, потом открыть, подредактировать и перезаписать? МОжет на лету нельзя?
PM MAIL WWW ICQ   Вверх
nitr
Дата 20.10.2006, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



MaxPayne, это как налету? smile)
залить - изменить - получаем всё ок


--------------------
PM   Вверх
MaxPayne
Дата 20.10.2006, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 9.8.2005

Репутация: нет
Всего: нет



Получилось его открыть и узнать размеры, дальше нахожу коэффициент сжатия (по барабану какая сторона больше)

$path$max = /home/www/htdocs/00000128.jpg


Код

open(FILE,">$path$max"); 
binmode(FILE);
print FILE <$file>;
close(FILE);


my $image = Image::Magick->new;
$image->Read("$path$max");
($img_width, $img_height) = $image->Get('width', 'height');
########################################### выдает 600х420
$scale = $img_width/300;
$res_heigt=int($img_height/$scale);
###########################################в итоге должно быть 300х210
$image->Scale(width=>"300", height=>"$res_heigt");
$image->Crop(width=>300, height=>$res_heigt, x=>0, y=>0);
$image->Write(filename=>'$path$max', compression=>'JPEG', quality=>'80');


Но файл не изменился в размерах.
PM MAIL WWW ICQ   Вверх
GoodBoy
Дата 23.10.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 4
Всего: 83



по-идее ты не можешь перезаписать открытый файл...  smile Попробуй сохранять его под другим именем...


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Zuzu
Дата 23.10.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 19.10.2006
Где: Екатеринбург

Репутация: 1
Всего: 4



Цитата(nitr @  20.10.2006,  19:42 Найти цитируемый пост)
MaxPayne, это как налету? )
залить - изменить - получаем всё ок 


На лету, это значит не сохряняя промежуточный результат во временный файл.

Судя по документации, должно работать (код, который написАл здесь даже не компилировал, заранее прошу прощения за возможные ошибки):

Код


#!/usr/bin/perl

use strict;
use CGI;
use Image::Magick;

my $cgi = new CGI;
my $file_field = "my_file";      # имя поля из <input type="file" ...
my $filename = $cgi->param($file_field);   # по идее - имя файла на диске пользователя
my $fh = $cgi->upload($file_field);      # по идее - FILE HANDLE
#

my $imgObj = new Image::Magick;
$imgObj->Read(file=>$fh);   # не работает !!! в документации сказано, что должно.

$imgObj->Read(file=>\$fh);   # чушь, но тоже не работает!!!



Ссылки на документацию:

(http://www.imagemagick.org/script/perl-magick.php)

Код

To read an image in the GIF format from a PERL filehandle, use:

  $image = Image::Magick->new;
  open(IMAGE, 'image.gif');
  $image->Read(file=>\*IMAGE);
  close(IMAGE);



perldoc CGI

Код

  To be safe, use the upload() function (new in version 2.47).  When
  called with the name of an upload field, upload() returns a filehandle,
  or undef if the parameter is not a valid filehandle.

  $fh = $query->upload('uploaded_file');
     while (<$fh>) {
            print;
     }

  This is the recommended idiom.


В чем же дело? Понятно, что проблема решена путем промежуточного сохранения в файл и чтения в дальнейшем из него.

Вопрос академический, поэтому отдельную тему решил не создавать.

Добавлено @ 16:00 
Цитата(MaxPayne @  20.10.2006,  22:13 Найти цитируемый пост)
$image->Write(filename=>'$path$max', compression=>'JPEG', quality=>'80');


Скорее всего, можно переписать существующий файл! Он ужЕ загружен в память!

Может дело в "волшебных пузырьках"? 

Замени на двойные кавычки =)

Код

#Было
$image->Write(filename=>'$path$max', compression=>'JPEG', quality=>'80');

#Стало
$image->Write(filename=>"$path$max", compression=>'JPEG', quality=>'80');



=)



Это сообщение отредактировал(а) Zuzu - 23.10.2006, 16:01
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
GoodBoy
Дата 24.10.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: 4
Всего: 83



Цитата(Zuzu @  23.10.2006,  16:50 Найти цитируемый пост)
Может дело в "волшебных пузырьках"? 

Замени на двойные кавычки =)

Тьфу ты...  Ну естественно!!!!!  В одинарных у тебя переменные твои не интерполитовались!!!!


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.