Converter arquivos Bitmap para ASCII-art
Publicado por jean michael gandin 11/06/2007
[ Hits: 9.299 ]
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);
}
Sudokou em C feito com matrizes e listas
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Como usar Gpaste no ambiente Cinnamon
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
VOL já não é mais como antes? (9)
É normal não gostar de KDE? (13)
E aí? O Warsaw já está funcionando no Debian 13? [RESOLVIDO] (15)
Secure boot, artigo interessante, nada técnico. (4)
copiar library para diretorio /usr/share/..... su com Falha na a... (1)









