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.c
Ugrás a fájl dokumentációjához.
1 
4 #include <stdio.h>
5 #include <stdlib.h>
6 
8 enum {
9  MAX_BRIGHT = 36,
10  ASCII_WIDTH = 79,
11  MAX_FNAME = 1000
12 };
13 
15 char ASCII[MAX_BRIGHT] = {
16  ' ', '.', '\'', '`', '\'', '-', '^', '\"', '!',
17  '>', ';', '=', '0', 'i', 'j', 'l', 't', 'c',
18  'f', 'o', 'a', 'V', '5', 'e', 'b', 'D', 'p',
19  'g', 'B', 'm', 'H', 'H', 'H', 'M', 'M', '@'
20 };
21 
22 typedef unsigned char Byte;
25 typedef struct {
26  Byte r;
27  Byte g;
28  Byte b;
29 } Pixel;
30 
32 typedef struct {
33  unsigned height;
34  unsigned width;
36 } Image;
37 
42 Image *image_read(char *fname)
43 {
44  Image *image;
45  FILE *fp;
46  unsigned depth;
47 
48  /* memóriafoglalás a struktúrának */
49  image = (Image *)malloc(sizeof(Image));
50  if (image == NULL) {
51  fprintf(stderr, "Error allocating memory for image\n");
52  return NULL;
53  }
54 
55  fp = fopen(fname, "rb");
56  if (fp == NULL) {
57  fprintf(stderr, "Error opening file %s\n", fname);
58  free(image);
59  return NULL;
60  }
61 
62  /* fejléc beolvasása a fájlból */
63  if (fscanf(fp, "P6\n%u%u%u%*c", &image->width, &image->height, &depth) != 3 || depth != 255u) {
64  fprintf(stderr, "Error reading image\n");
65  free(image);
66  fclose(fp);
67  return NULL;
68  }
69 
70  /* pixeltömb foglalása */
71  image->pixels = (Pixel *)malloc(image->height*image->width*sizeof(Pixel));
72  if (image->pixels == NULL) {
73  fprintf(stderr, "Error allocating memory to image data\n");
74  free(image);
75  fclose(fp);
76  return NULL;
77  }
78 
79  /* pixeladatok beolvasása */
80  if (fread(image->pixels, sizeof(Pixel), image->height*image->width, fp) != image->height*image->width) {
81  fprintf(stderr, "Error reading image data\n");
82  free(image->pixels);
83  free(image);
84  fclose(fp);
85  return NULL;
86  }
87 
88  fclose(fp);
89  return image;
90 }
91 
95 void image_close(Image *image)
96 {
97  free(image->pixels);
98  free(image);
99 }
100 
107 Pixel get_pixel(Image *image, int h, int w)
108 {
109  int idx = h*image->width+w;
110  return image->pixels[idx];
111 }
112 
118 {
119  return (Byte) (p.r/3. + p.g/3. + p.b/3.);
120 }
121 
123 void image_to_ascii(Image *image)
124 {
125  unsigned W = image->width/ASCII_WIDTH + 1; /* egy ASCII karakter ennyi pixel széles lesz */
126  unsigned H = W * 1.7; /* és ennyi magas */
127 
128  unsigned h, w;
129  for (h = 0; h < image->height/H; ++h) { /* minden ascii sorra és oszlopra */
130  for (w = 0; w < image->width/W; ++w) {
131  unsigned i, j, b = 0; /* b a fényesség */
132  for (i = 0; i < H; ++i) /* a blokk minden pixelére */
133  for (j = 0; j < W; ++j) {
134  Pixel p = get_pixel(image, h*H+i, w*W+j);
135  b += pixel_brightness(p);
136  }
137  b *= MAX_BRIGHT / 256.0 / (W * H);
138  printf("%c", ASCII[b]); /* karakter kikeresése és kiírása */
139  }
140  printf("\n");
141  }
142 }
143 
145 int main(void)
146 {
147  char fname[MAX_FNAME];
148  Image *image; /* A képstruktúrára mutató pointer */
149 
150  printf("fajlnev: "); fflush(stdout);
151  scanf("%s", fname);
152  image = image_read(fname); /* kép beolvasása */
153  if (image == NULL)
154  return 1;
155 
156  image_to_ascii(image); /* kép feldolgozása */
157  image_close(image); /* kép felszabadítása */
158 
159  return 0;
160 }
161 
unsigned width
a kép szélessége pixelben
Definition: ascii.c:34
char ASCII[MAX_BRIGHT]
az ASCII karakterek tömbje
Definition: ascii.c:15
bitmap képet tároló struktúra típus
Definition: ascii.c:32
ennyi különböző fényességérték van
Definition: ascii.c:9
unsigned height
a kép magassága pixelben
Definition: ascii.c:33
egyetlen pixel adatait tartlmazó struktúra
Definition: ascii.c:25
unsigned char Byte
egybájtos típus
Definition: ascii.c:22
Byte r
a pixel piros színkomponense
Definition: ascii.c:26
void image_close(Image *image)
kép bezárása
Definition: ascii.c:95
void image_to_ascii(Image *image)
képet ASCII karakterekkel ábrázol
Definition: ascii.c:123
max. ilyen hosszú lehet a fájlnév
Definition: ascii.c:11
Byte b
a pixel kék színkomponense
Definition: ascii.c:28
Pixel get_pixel(Image *image, int h, int w)
a kép egy pixele indexek alapján
Definition: ascii.c:107
ilyen széles lesz az ASCII kép
Definition: ascii.c:10
Byte g
a pixel zöld színkomponense
Definition: ascii.c:27
Image * image_read(char *fname)
kép beolvasása PPM fájlból
Definition: ascii.c:42
Byte pixel_brightness(Pixel p)
egy pixel fényessége
Definition: ascii.c:117
Pixel * pixels
a pixelek dinamikus tömbje (sorfolytonos)
Definition: ascii.c:35
int main(void)
A főprogram.
Definition: ascii.c:145