ASCII art
Képnézegetés parancssoron
 Összes Adatszerkezetek Fájl Függvények Változók Típusdefiníciók Enumeráció-értékek Oldal
ascii_lend.c
1 
4 #include <stdio.h>
5 #include <stdlib.h>
6 
8 enum {
9  MAX_BRIGHT = 36
10 };
12 char ASCII[MAX_BRIGHT] = {
13  ' ', '.', '\'', '`', '\'', '-', '^', '\"', '!',
14  '>', ';', '=', '0', 'i', 'j', 'l', 't', 'c', 'f',
15  'o', 'a', 'V', '5', 'e', 'b', 'D', 'p', 'g', 'B',
16  'm', 'H', 'H', 'H', 'M', 'M', '@'
17 };
18 
19 typedef unsigned char byte;
20 typedef byte pixel;
23 void image_to_ascii(pixel image[], int height, int width, int ascii_width)
24 {
25  int block_w = width/ascii_width; /* egy karakter ennyi pixel széles lesz */
26  int block_h = block_w * 2; /* és ennyi magas */
27 
28  int h, w;
29  for (h = 0; h < height/block_h; ++h) { /* minden ascii sorra és oszlopra */
30  for (w = 0; w < ascii_width; ++w) {
31  int i, j, b = 0; /* b a fényesség */
32  for (i = 0; i < block_h; ++i) { /* minden pixelre */
33  for (j = 0; j < block_w; ++j) {
34  int pix_h = h*block_h+i;
35  int pix_w = w*block_w+j;
36  b += image[pix_h*width + pix_w]; /* 2D indexelés */
37  }
38  }
39  b *= MAX_BRIGHT / 256.0 / (block_w * block_h);
40  printf("%c", ASCII[b]); /* karakter kikeresése és kiírása */
41  }
42  printf("\n");
43  }
44 }
45 
47 int read_bigendian(FILE *fp, int b)
48 {
49  int i;
50  int ret = 0;
51  byte bytes[16];
52  fread(bytes, 1, b, fp);
53  for (i = 0; i < b; ++i)
54  ret = 256 * ret + bytes[i];
55  return ret;
56 }
57 
59 int read_littleendian(FILE *fp, int b)
60 {
61  int i;
62  int ret = 0;
63  byte bytes[16];
64  fread(bytes, 1, b, fp);
65  for (i = b-1; i >= 0; --i)
66  ret = 256 * ret + bytes[i];
67  return ret;
68 }
69 
73 pixel *read_image(char *fname, int *height, int *width)
74 {
75  pixel *image = NULL;
76  int h, w; /* magasság, szélésség */
77  FILE *fp = fopen(fname, "rb");
78  if (fp == NULL) {
79  fprintf(stderr, "Cannot open file %s for binary reading", fname);
80  return NULL;
81  }
82  h = read_littleendian(fp, 2);
83  w = read_littleendian(fp, 2);
84  image = (pixel *)malloc(h * w * sizeof(pixel));
85  if (image == NULL) {
86  fprintf(stderr, "Cannot allocate memory for %d x %d pixels\n", h, w);
87  fclose(fp);
88  return NULL;
89  }
90  if (fread(image, sizeof(pixel), h * w, fp) != h * w) {
91  fprintf(stderr, "Cannot read %d x %d pixels from file %s\n", h, w, fname);
92  free(image);
93  fclose(fp);
94  return NULL;
95  }
96 
97  fclose(fp);
98  *height = h;
99  *width = w;
100  return image;
101 }
102 
104 int main(void)
105 {
106  int width, height, w_ascii;
107  char fname[100];
108  pixel *image;
109 
110  printf("Filename: "); scanf("%s", fname);
111  printf("ascii width: "); scanf("%d", &w_ascii);
112 
113  image = read_image(fname, &height, &width);
114  if (image == NULL)
115  return 1;
116 
117  image_to_ascii(image, height, width, w_ascii);
118 
119  free(image);
120  return 0;
121 }
122 
char ASCII[MAX_BRIGHT]
az ASCII karakterek tömbje
Definition: ascii.c:15
ennyi különböző fényességérték van
Definition: ascii.c:9
void image_to_ascii(Image *image)
képet ASCII karakterekkel ábrázol
Definition: ascii.c:123
int main(void)
A főprogram.
Definition: ascii.c:145