Ключевые слова:perl, console, linux, (найти похожие документы)
Date: Mon, 17 Jun 2002 05:23:01 +0000 (UTC)
From: Max Ischenko <max@malva.com.ua>
Newsgroups: fido7.ru.linux
Subject: [Linux] Скрипт для создания скриншота консоли.
VM> Да! Помню как-то читал статью про скриншот консоли, но там про фрю было.
VM> Я посмотрел под линукс - штатными утилитами что-то не получается. Даже
VM> снимок консоли не понял откуда взять, из vcs он без цветов :(
VM> Кто-нибудь знает как это делать? Причем интересно стандартными
VM> средствами, т.е. руками вытащить изображение и какой-нибудь txt2pic на
VM> него натравить. И чтобы цвета остались, без них что-нибудь ncurses'ное
VM> не смотрится.
#!/usr/bin/perl
#From: "Andrew B. Sapozhnikov" <sapa@hq.icb.chel.su>
#Subject: Re: Как сграбить с консоли?
my $ttynum=shift or die "Usage: grab <vttynum>";
die "$ttynum: Incorrect virtual console number" unless $ttynum=~/^\d+$/;
$ttydev="/dev/tty" . $ttynum;
$vcsadev="/dev/vcsa" . $ttynum;
open(VCSA,$vcsadev) or die "Cannot open $vcsadev: $!";
$len=read(VCSA,$buf,16384);
close(VCSA);
my($height,$width,$curx,$cury)=unpack('C4',$buf);
open(T,$ttydev) or die "Cannot open $ttydev: $!";
my $fnt=pack('L4096',0);
my $fntx=pack('SSP',256,32,$fnt);
ioctl(T,0x4B6B,$fntx) or die "Cannot grab console font: $!";
close(T);
my($nchars,$fheight)=unpack('SS',$fntx);
if($fheight>=14) {
$thickness=2;
} else {
$thickness=1;
}
foreach my $c (0..255) {
my @tmp;
my @ch=split(//,substr($fnt,$c*32,$fheight));
push @tmp, [ split(//,unpack('B8',shift @ch)) ] while @ch;
push @font,[ @tmp ];
}
print 'BM'.pack('L29',
$width*$height*$fheight*4+118,0,118,40,$width*8,$height*$fheight,0x40001,
0,$width*$height*$fheight*4,0x120b,0x120b,16,16,
0x000000,0x000080,0x008000,0x008080,0x800000,0x800080,0x808000,0xC0C0C0,
0x808080,0x0000FF,0x00FF00,0x00FFFF,0xFF0000,0xFF00FF,0xFFFF00,0xFFFFFF);
for($line=$height-1;$line>=0;--$line) {
my @img;
push @img,[] while (1..$fheight);
foreach my $col (0..$width-1) {
my ($fgattr,$bgattr)=
split(//,unpack('h2',substr($buf,5+2*($line*$width+$col),1)));
my $ch=unpack('C',substr($buf,4+2*($line*$width+$col),1));
if($line==$cury && $col==$curx) {
foreach (1..$fheight-$thickness) {
push(@{$img[$fheight-$_]},
map {$_?$fgattr:$bgattr} @{$font[$ch][$_-1]});
}
foreach (0..$thickness-1) {
push @{$img[$_]},($fgattr)x8;
}
} else {
foreach (1..$fheight) {
push(@{$img[$fheight-$_]},
map {$_?$fgattr:$bgattr} @{$font[$ch][$_-1]});
}
}
}
foreach(@img) {
print pack('H'.(8*$width),join('',@$_));
}
}