Converter arquivos Bitmap para ASCII-art
Publicado por jean michael gandin 11/06/2007
[ Hits: 9.478 ]
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.
/*
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);
}
Estrutura de dados: Lista dinâmica duplamente encadeada
Jogo da Velha com IA invencivel
Rotina para controle de portas paralelas em C.
Nenhum comentário foi encontrado.
Criptografando sua Home com Gocryptfs para tristeza do meliante
A Involução do Linux e as Lambanças Desnecessárias desde o seu Lançamento
O Journal no Linux para a guarda e consulta de logs do sistema
A evolução do Linux e as mudanças que se fazem necessárias desde o seu lançamento
Discos que não instalam o sistema por erro MBR/GPT no Linux
Hospedagem de Mangás com Kavita e Docker para Acesso Remoto via Tailscale
Aplicar tema e ícones do Ubuntu Cinnamon no Arch Linux sem AUR
Instalação do driver Epson L3150 [RESOLVIDO] (5)
Continuando meus tópicos anteriores (7)









