Converter arquivos Bitmap para ASCII-art
Publicado por jean michael gandin 11/06/2007
[ Hits: 9.397 ]
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);
}
Fila bancária utilizando lista simplisment encadeada
Pilhas Encadeadas Detalhadamente
Joguinho de labirinto usando as setas do teclado
gerador automatico de Makefiles
Programa recursivo para obter raiz quadrada
Nenhum comentário foi encontrado.
KDE Plasma - porque pode ser a melhor opção de interface gráfica
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Instalar Linux em notebook Sony Vaio VPCEG13EB (13)
Vou destruir sua infância:) (7)
Interface gráfica com problema (0)









