Главная страница


ru.linux

 
 - RU.LINUX ---------------------------------------------------------------------
 From : Max Ischenko                         2:5020/400     17 Jun 2002  09:23:01
 To : Vladimir Mosgalin
 Subject : Re: ScreenShot
 -------------------------------------------------------------------------------- 
 
 
  Vladimir Mosgalin wrote:
 
 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('',@$_));
   }
 }
 -- 
 One of the most unpleasant features of UNIX is that commands' names are of 2
 letters only and therefore are hard to memorize. That's why I use one-letter
 aliases.
 --- ifmail v.2.15dev5
  * Origin: Unknown (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: ScreenShot   Vladimir Mosgalin   15 Jun 2002 22:50:11 
 Re: ScreenShot   Victor Wagner   16 Jun 2002 12:38:53 
 Re: ScreenShot   Max Ischenko   17 Jun 2002 09:23:01 
Архивное /ru.linux/34873b415d7.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional