Как я могу использовать WWW :: Mechanize для сохранения ширины, высоты и байтов изображения? - PullRequest
2 голосов
/ 18 июля 2011

Я хочу загрузить изображения с помощью WWW: Mechanize и сохранить в именах файлов их размеры (ширина x высота, байты), но не могу понять, как извлечь байты в читаемый формат - my $ img_bytes = format_bytes (????, точность => 2);Спасибо.

use strict; 
use warnings;
use File::Basename;
use Data::Dumper;
use Number::Format qw(format_bytes);
use WWW::Mechanize;

my $url = '';

my $mech = WWW::Mechanize->new();

$mech->get( $url );

my @img = $mech->find_all_images(url_regex => qr/\.(?:jpg|png)$/);

foreach my $img (@img) {
    my $filename = basename($img->url);
    $filename =~ /^(.*?)(\.\w+)$/; 
    my ($name,$ext) = ($1,$2); 
    my $img_width = $img->width;
    my $img_height = $img->height;
    my $img_size = ' ('.$img_width.' x '.$img_height.', '.$img_bytes.')';
    $mech->get( $img->url, ':content_file' => $name.$img_size.$ext );
}

1 Ответ

6 голосов
/ 18 июля 2011

Извлеките файл из временного файла, затем запустите my $bytes = -s $tempfilename;, затем переименуйте файл.И вы понимаете, что ->width и ->height взяты из тега, а не фактической ширины и высоты изображения, верно?

Вот как я мог бы написать ваш код:

#!/user/bin/env perl

use strict; 
use warnings;
use autodie;

use WWW::Mechanize;
use File::Basename;
use File::Temp     qw/tempfile/;
use Image::Info    qw/image_info dim/;
use Number::Format qw/format_bytes/;

my $url = 'http://www.perl.org';

my $mech = WWW::Mechanize->new;

$mech->get( $url );

for my $img ($mech->find_all_images(url_regex => qr/\.(?:jpg|png)$/)) {
    my ($name, undef, $ext) = fileparse($img->url, "jpg", "png");

    (undef, my $temp) = tempfile;

    $mech->get( $img->url, ':content_file' => $temp );

    my ($w, $h) = dim image_info $temp;
    my $s       = format_bytes -s $temp, precision => 2;
    my $dim     = "($w x $h, $s)";

    rename $temp, "$name$dim.$ext";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...