[LUGOS] screenshoti

Andrej Lajovic andrej.lajovic at guest.arnes.si
Mon Feb 17 00:19:00 CET 2003


On Wed, 12 Feb 2003, Goran Kavrecic wrote:

> Ena nova naloga:
>
> Rad bi naredil screenshote zaslonov konzolne aplikacije.
>
> Težava je, da v X konzoli nimam istega fonta kot v konzoli.
> Uporabljam nekatere znake za risanje frame-ov, tako font precej vpliva na
> zadevo!
> Sicer pa delam v RH7.3 GNOME.

Uh, oh. Jaz sem to delal takole:


# cat /dev/vcsa1 >scrshot.vcsa
$ vcsa2ansi scrshot.vcsa scrshot.ans
$ ansi2gif scrshot.ans scrshot.gif


Prvi ukaz je treba izvest kot root, ker gre za dostop do /dev/vcsa*. Drugi
ukaz pretvori vcsa zapis v ansi kode, tretji pa to potem v gif. Cat že
imaš :) vcsa2ansi je moj produkt in je pripet spodaj (POZOR: nastavi
vrednost LINES in COLUMNS v programu na velikost tvoje konzole, napisano
velja za mojo), ansi2gif pa dobiš na freshmeat.net. Pri tretjem koraku
zadeva ni tako zelo enostavna, kot sem napisal, zraven grejo potem še ene
opcije za velikost konzole in font, poglej si man page.

Vmesno fazo, v tem primeru scrshot.ans, si lahko ogledaš kar s
'cat scrshot.ans' (ali bolje: 'cat scrshot.ans; read').

vcsa2ansi je quick'n'dirty hack in ne odgovarjam za pravilno delovanje,
čeprav je bilo pri meni vedno vse v redu.

Lep pozdrav,
Andrej



--------8<---------8<-----vcsa2ansi.c--------8<------------8<-------------
/* VCSA2ANSI - pretvarja zapis iz /dev/vcsa v ANSI                   */
/*                                                                   */
/* gcc -o vcsa2ansi vcsa2ansi.c                                      */
/*                                                                   */

#include <stdio.h>
#include <string.h>

#define LINES 48
#define COLUMNS 128

int col2ansi(int col);

int main(int argc, char *argv[]) {
   FILE *in, *out;
   int fcolor = 0, bcolor = 0, i;
   int nfcolor = 0, nbcolor = 0;
   int blankf = 0, blankb = 0;
   char znak, atr, spec[5] = "";

   if (argc != 3) {
      printf("vcs2ansi input.asc output.ans\n");
      return(1);
   }

   in = fopen(argv[1], "r");
   if (in == NULL) {
      printf("%d\n%d\n", in, out);
      printf("Napaka pri odpiranju datoteke \"%s\"\n", argv[1]);
      return(1);
   }

   out = fopen(argv[2], "w");
   if (out == NULL) {
      printf("%d\n%d\n", in, out);
      printf("Napaka pri odpiranju datoteke \"%s\"\n", argv[2]);
      return(1);
   }


   fseek(in, 4, SEEK_SET);

   for(i = 1; i <= LINES * COLUMNS; i++) {
      if ((fread(&znak, 1, 1, in) == 0) || (fread(&atr, 1, 1, in) == 0)) {
         fprintf(out, "\033[0m");
         fclose(in);
         fclose(out);
         return(0);
      }

      nbcolor = (atr - (atr % 16)) / 16;
      nfcolor = atr % 16;

      if ((fcolor != nfcolor) || (bcolor != nbcolor)) {
         fcolor = nfcolor;
         bcolor = nbcolor;
         blankf = fcolor;
         blankb = bcolor;
         if (fcolor > 7) {
            if(strstr(spec, "1;") == NULL)
               strcat(spec, "1;");
            blankf = fcolor - 8;
         }
         else if (bcolor > 7) {
            if(strstr(spec, "5;") == NULL)
               strcat(spec, "5;");
            blankb = bcolor - 8;
         }
         else {
            strcpy(spec, "0;");
         }
         fprintf(out, "\033[%s%d;%dm%c", spec,\
                 col2ansi(blankf), (col2ansi(blankb) + 10), znak);
         fflush(out);
      }
      else {
         fprintf(out, "%c", znak);
      }

      if (((i % COLUMNS) == 0) && (i != LINES * COLUMNS))
         fprintf(out, "\n");
   }

   fprintf(out, "\033[0m");
   fclose(in);
   fclose(out);
   return(0);
}

int col2ansi(int col) {
   int i[8] = {30, 34, 32, 36, 31, 35, 33, 37};
   return(i[col]);
}
--------8<---------8<----------8<------------8<------------8<-------------



More information about the lugos-list mailing list