Почитав на хабре статьи про спутник Электро-Л(раз, два, три), захотелось и себе заиметь красивую гифку с Землей. Немного подумав, захотелось создание этой гифки как-то автоматизировать.
Сказанно — сделано. Источники снимков упоминались в постах выше, но некоторые сложности были в связи с тем, что ни в одном источнике нет всех снимков за конкретный день. Пришлось обращаться к нескольким ftp-серверам.
Вот собственно код, отвечающий за загрузку картинок за интереующий день:
Далее надо было обработать полученные снимки и превратить их в анимацию. Для этого использовался пакет Image::Magick. Вот вся обработка изображений:
В планах добавить возможность создания анимации за больший промежуток времени, чем один день, а так же возможность выбора итоговых размеров изображения.
Программа доступна на гитхабе.
Сказанно — сделано. Источники снимков упоминались в постах выше, но некоторые сложности были в связи с тем, что ни в одном источнике нет всех снимков за конкретный день. Пришлось обращаться к нескольким ftp-серверам.
Вот собственно код, отвечающий за загрузку картинок за интереующий день:
my $ftp = Net::FTP->new("ftp.ntsomz.ru", Debug => $debug, Passive => 1, ) or die "Can't connect to server : $@";
$ftp->login("electro","electro") or die "Can't login at server ", $ftp->message;
my $resftp = Net::FTP->new("ftp1.rcpod.ru", Debug => $debug, Passive => 1) or die "Can't connect to server : $@";
$resftp->login() or die "Can't login at server ", $resftp->message;
$ftp->binary();
$resftp->binary();
$resftp->cwd("ElectroL") or die "Can't find directory", $resftp->message;
$ftp->cwd($year) or die "Can't find directory ", $ftp->message;
$resftp->cwd($year) or die "Can't find directory ", $resftp->message;
$ftp->cwd($months{$month}) or die "Can't find directory ", $ftp->message;
$resftp->cwd($months{$month}) or die "Can't find directory ", $resftp->message;
$ftp->cwd($day) or die "Can't find directory ", $ftp->message;
$resftp->cwd($day) or die "Can't find directory ", $resftp->message;
for (my $i = 0; $i < 48; $i++) {
my $nextdir = ($i > 19 ? ($i - $i % 2) / 2 : "0" . ($i - $i % 2) / 2 ) . ($i % 2 ? "30" : "00" ); #generate all directories names
if($nextdir le "0600" || $nextdir ge "0830"){
$ftp->cwd($nextdir) or die "Can't find directory ", $ftp->message;
my $addr = ($year % 100) . $month . $day . "_" . $nextdir . "_RGB.jpg" or die "Can't download file ", ftp->message;
push @files, $ftp->get($addr, "tmp\/$i.jpg");
$ftp->cdup() or die "Can't find directory ", $ftp->message;
}
else{
$resftp->cwd($nextdir) or die "Can't find directory ", $resftp->message;
my $addr = ($year % 100) . $month . $day . "_" . $nextdir . "_RGB.jpg" or die "Can't download file ", ftp->message;
push @files, $resftp->get($addr, "tmp\/$i.jpg");
$resftp->cdup() or die "Can't find directory ", $resftp->message;
}
}
$ftp->quit;
$resftp->quit;
Далее надо было обработать полученные снимки и превратить их в анимацию. Для этого использовался пакет Image::Magick. Вот вся обработка изображений:
my $image = new Image::Magick;
foreach my $x (@files) {
$image->Read($x) if $x;
}
$image->Contrast();
for (my $x = 0; $image->[$x]; $x++)
{
$image->[$x]->Frame('1080x1080') if $image->[$x]->Get('magick') eq 'GIF';
undef $image->[$x] if $image->[$x]->Get('columns') < 1080;
}
$image->Write($outfile);
В планах добавить возможность создания анимации за больший промежуток времени, чем один день, а так же возможность выбора итоговых размеров изображения.
Программа доступна на гитхабе.