Pull to refresh

Автоматизация сщздания .gif изображений по снимкам Электро-Л

Почитав на хабре статьи про спутник Электро-Л(раз, два, три), захотелось и себе заиметь красивую гифку с Землей. Немного подумав, захотелось создание этой гифки как-то автоматизировать.


Сказанно — сделано. Источники снимков упоминались в постах выше, но некоторые сложности были в связи с тем, что ни в одном источнике нет всех снимков за конкретный день. Пришлось обращаться к нескольким 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);


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

Программа доступна на гитхабе.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.