Converter arquivos Bitmap para ASCII-art

Publicado por jean michael gandin 11/06/2007

[ Hits: 9.049 ]

Download bmascii.zip




Este script serve para converter bitmaps para um aqruivo texto contendo caracteres ascii que simulam os tons de cinza da imagem.

Opera com bitmaps planos e compactados, desde que tenham 256 cores ou menos..

O bitmap deve ser invertido antes de ser convertido.

  



Esconder código-fonte

/*
  todo: eleiminar espacos em branco no final das linhas..
*/

#include <stdio.h>
#include "bmp.h"

#define USEFILE 0 // usa stdout pra saida

/*#define BITS 6
  #define filter (1 << BITS)
  #define mask (filter -1)*/

#define MAXX (argc > 2 ? atoi(argv[2]) : 30)
#define MAXY (argc > 3 ? atoi(argv[3]) : 63)
#define MINX (argc > 4 ? atoi(argv[4]) : 0)
#define MINY (argc > 5 ? atoi(argv[5]) : 0)


/* luma */
//#define GRAY(c) ((11 * pal[c][0] + 59 * pal[c][1] + 30 * pal[c][2]) / 100 )
/* luminance */
#define GRAY(c) ((7 * pal[c][0] + 71 * pal[c][1] + 21 * pal[c][2]) / 100 )
/* averagr */
//#define GRAY(c) ( pal[c][0] + pal[c][1] +  pal[c][2] )

#define compressed bmph.COMPRESSION

int
main (int argc, char **argv)
{
  // const char acolors[] = "RSACsc, ";
  const char acolors[] = "WNEHDPZY652sc;:. ";
  struct bmph bmph;
  unsigned int pal[257][3];
  FILE *fp, *O;
  unsigned int x, y, i, c, p, cold = -1, a1, a2, ctr = 0, pc;
  if (argc < 2)
    {
      fprintf (stderr, "Usage\n%s file.bmp [MAXX] [MAXY] [MINX] [MINY]\n");
      return;
    }
  fp = fopen (argv[1], "rb");
  if (fp == NULL)
    {
      fprintf (stderr, "Erro %s!\n", argv[1]);
      return;
    }

  // fread(&bmph, sizeof(bmph), 1, fp);

  if (fgetc (fp) != 'B' || fgetc (fp) != 'M')
    {
      fprintf (stderr, "File is not a bitmap\n");
      return;
    }

  fread (&bmph, sizeof (bmph), 1, fp);

  if (bmph.BITPERPIXEL != 8)
    {
      fprintf (stderr, "BITESPER PIXEL = %d\n");
      return;
    }

  fprintf (stderr, "%d\n", bmph.IMAGE_WIDTH);

  fseek (fp, 54, SEEK_SET);
  fprintf (stderr, "OFFS = %ld\n", bmph.offs);
  for (i = 0; i < (bmph.offs - 54) / 4; i++)
    {

      //   printf("#%02x%02x%02x\n", pal[i][0], pal[i][1], pal[i][2]);
      pal[i][2] = fgetc (fp);
      if (pal[i][2])
   pal[i][2]--;
      pal[i][1] = fgetc (fp);
      if (pal[i][1])
   pal[i][1]--;
      pal[i][0] = fgetc (fp);
      if (pal[i][0])
   pal[i][0]--;
      fgetc (fp);
    }
  for (a1 = GRAY (0), a2 = GRAY (0), i = 1; i < (bmph.offs - 54) / 4; i++)
    {
      if (GRAY (i) < a1)
   a1 = GRAY (i);
      if (GRAY (i) > a2)
   a2 = GRAY (i);
    }
  if (a1 == a2)
    {
      fprintf (stderr, "PANIC: all colors have the same gray level!\n");
      return -1;
    }
#if USEFILE
  O = fopen("o.txt", "wt");
#else
  O = stdout;
#endif

  fseek (fp, bmph.offs, SEEK_SET);
  for (y = 0; y < bmph.IMAGE_HEIGHT; y++)
    {
      for (x = 0; x < (bmph.flen - bmph.offs) / bmph.IMAGE_HEIGHT; x++)
   {
     if (compressed)
       {
         if (ctr > 0)
      {
        ctr--;
      }
         else
      {
        ctr = fgetc (fp);
        c = fgetc (fp);
        if (!ctr)
          {
            // fprintf(stderr,"(%d, %d)\n", c,x);
            x = bmph.IMAGE_WIDTH;
          }
        else
          ctr--;
      }
       }
     else
       {
         c = fgetc (fp);
       }
     if (x < bmph.IMAGE_WIDTH)
       {
         pc = ((GRAY (c) - a1) * (strlen (acolors) - 1)) / (a2 - a1);
         if (pc >= strlen (acolors))
      {
        fprintf (stderr, "PANIC: pc > sizeof(acolors)\n");
        return -1;
      }
         if (x < MAXX && y < MAXY && x >= MINX && y >= MINY)
      {
        //if(pal[c][0] + pal[c][1] + pal[c][2] > 128 * 3) fprintf(O,"\e[5m");
        fprintf (O, "%c", acolors[pc]);
        fprintf (O, "%c", acolors[pc]);
      }
       }
   }
      //  for(i=0;i<6;i++) fgetc(fp);
      if (y < MAXY && y >= MINY)
   fprintf (O, "\n");
    }
  fclose (fp);
  fclose (O);
}

Scripts recomendados

Analisador Léxico 0.5

Jogo Windows Invaders (com gráficos)

Pilha

Minishell

Jantar dos Filósofos - Programação Paralela


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts