source: libcaca/trunk/caca-php/examples/img2txt.php @ 3316

Last change on this file since 3316 was 3316, checked in by bsittler, 11 years ago

more copyright info

  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 9.5 KB
Line 
1#!/usr/bin/php5
2<?php
3/*
4 *  img2txt       image to text converter
5 *  Copyright (c) 2008 Benjamin C. Wiley Sittler <bsittler@gmail.com>
6 *
7 *  This file is a Php port of "src/img2txt.c"
8 *  which is:
9 *  Copyright (c) 2006 Sam Hocevar <sam@zoy.org>
10 *                2007 Jean-Yves Lamoureux <jylam@lnxscene.org>
11 *                All Rights Reserved
12 *
13 *  $Id: img2txt.php 3316 2008-11-07 08:38:55Z bsittler $
14 *
15 *  This program is free software. It comes without any warranty, to
16 *  the extent permitted by applicable law. You can redistribute it
17 *  and/or modify it under the terms of the Do What The Fuck You Want
18 *  To Public License, Version 2, as published by Sam Hocevar. See
19 *  http://sam.zoy.org/wtfpl/COPYING for more details.
20 */
21
22if (php_sapi_name() != "cli") {
23        die("You have to run this program with php-cli!\n");
24}
25
26class MygetoptException extends Exception
27{
28}
29
30$myoptind = 0;
31
32function mygetopt($shortopts, $longopts)
33{
34        global $argc, $argv, $myoptind;
35        if($myoptind < 0)
36        {
37                $myoptind = 0;
38        }
39        if(($myoptind + 1) >= $argc)
40        {
41                return NULL;
42        }
43        $myoptind ++;
44        $nextarg = $argv[$myoptind];
45        $ret = NULL;
46        if((substr($nextarg, 0, 1) != '-')
47        ||
48        ($nextarg == '-'))
49        {
50                $myoptind = $argc - 1;
51        }
52        else
53        {
54                $skipopt = $myoptind;
55                $skipopts = 1;
56                if($nextarg == '--')
57                {
58                        $myoptind = $argc - 1;
59                }
60                else
61                {
62                        $opt = NULL;
63                        $arg = NULL;
64                        foreach($longopts as $longopt)
65                        {
66                                $optional = false;
67                                $hasarg = false;
68                                if(($longopt != '::') && substr($longopt, -2) == '::')
69                                {
70                                        $optional = true;
71                                        $hasarg = true;
72                                        $longopt = substr($longopt, 0, -2);
73                                }
74                                else if(($longopt != ':') && substr($longopt, -1) == ':')
75                                {
76                                        $optional = false;
77                                        $hasarg = true;
78                                        $longopt = substr($longopt, 0, -1);
79                                }
80                                if($nextarg == ('--' . $longopt))
81                                {
82                                        $opt = '--' . $longopt;
83                                        if($hasarg && ! $optional)
84                                        {
85                                                if(($myoptind + 1) < $argc)
86                                                {
87                                                        $myoptind ++;
88                                                        $skipopts ++;
89                                                        $arg = $argv[$myoptind];
90                                                }
91                                                else
92                                                {
93                                                        throw new MygetoptException("option \"$opt\" requires an argument");
94                                                }
95                                        }
96                                        break;
97                                }
98                                else if(substr($nextarg, 0, strlen('--' . $longopt . '='))
99                                                ==
100                                                ('--' . $longopt . '='))
101                                {
102                                        $opt = '--' . $longopt;
103                                        $arg = substr($nextarg, strlen($opt . '='));
104                                        if(! $hasarg)
105                                        {
106                                                throw new MygetoptException("option \"$opt\" does not allow an argument");
107                                        }
108                                        break;
109                                }
110                        }
111                        if($opt === NULL)
112                        {
113                                for($i = 0; $i < strlen($shortopts); $i ++)
114                                {
115                                        $optional = false;
116                                        $hasarg = false;
117                                        $shortopt = substr($shortopts, $i, 1);
118                                        if(substr($shortopts, $i + 1, 2) == '::')
119                                        {
120                                                $optional = true;
121                                                $hasarg = true;
122                                                $i += 2;
123                                        }
124                                        else if(substr($shortopts, $i + 1, 1) == ':')
125                                        {
126                                                $hasarg = true;
127                                        }
128                                        if($nextarg
129                                        ==
130                                        ('-' . $shortopt))
131                                        {
132                                                $opt = '-' . $shortopt;
133                                                if($hasarg && ! $optional)
134                                                {
135                                                        if(($myoptind + 1) < $argc)
136                                                        {
137                                                                $myoptind ++;
138                                                                $skipopts ++;
139                                                                $arg = $argv[$myoptind];
140                                                        }
141                                                        else
142                                                        {
143                                                                throw new MygetoptException("option \"$opt\" requires an argument");
144                                                        }
145                                                }
146                                                break;
147                                        }
148                                        else if(substr($nextarg, 0, strlen('-' . $shortopt))
149                                                        ==
150                                                        ('-' . $shortopt))
151                                        {
152                                                $opt = '-' . $shortopt;
153                                                if($hasarg)
154                                                {
155                                                        $arg = substr($nextarg, strlen($opt));
156                                                }
157                                                else
158                                                {
159                                                        $argv[$myoptind] = '-' . substr($nextarg, strlen($opt));
160                                                        $myoptind --;
161                                                        $skipopts = 0;
162                                                }
163                                        }
164                                }
165                        }
166                        if($opt === NULL)
167                        {
168                                if(substr($nextarg, 0, strlen('--')) == '--')
169                                {
170                                        $longopt = substr($nextarg, strlen('--'));
171                                        if(strpos($longopt, '=') !== false)
172                                        {
173                                                $longopt = substr($longopt, 0, strpos($longopt, '='));
174                                        }
175                                        throw new MygetoptException("option \"--$longopt\" is not recognized");
176                                }
177                                $shortopt = substr($nextarg, strlen('-'), 1);
178                                throw new MygetoptException("option \"-$shortopt\" is not recognized");
179                        }
180                        $ret = array($opt, $arg);
181                }
182                if ($skipopts > 0)
183                {
184                        for($i = 0; $i < $argc; $i ++)
185                        {
186                                if(($i < $skipopt) || ($i >= ($skipopt + $skipopts)))
187                                {
188                                        $new_argv[] = $argv[$i];
189                                }
190                        }
191                        if($myoptind >= $skipopt)
192                        {
193                                $myoptind -= $skipopts;
194                        }
195                        $argv = $new_argv;
196                        $argc = count($argv);
197                }
198        }
199        return $ret;
200}
201
202function usage($argc, $argv)
203{
204        fprintf(STDERR, "Usage: %s [OPTIONS]... <IMAGE>\n", $argv[0]);
205        fprintf(STDERR, "Convert IMAGE to any text based available format.\n");
206        fprintf(STDERR, "Example : %s -W 80 -f ansi ./caca.png\n\n", $argv[0]);
207        fprintf(STDERR, "Options:\n");
208        fprintf(STDERR, "  -h, --help\t\t\tThis help\n");
209        fprintf(STDERR, "  -v, --version\t\t\tVersion of the program\n");
210        fprintf(STDERR, "  -W, --width=WIDTH\t\tWidth of resulting image\n");
211        fprintf(STDERR, "  -H, --height=HEIGHT\t\tHeight of resulting image\n");
212        fprintf(STDERR, "  -x, --font-width=WIDTH\t\tWidth of output font\n");
213        fprintf(STDERR, "  -y, --font-height=HEIGHT\t\tHeight of output font\n");
214        fprintf(STDERR, "  -b, --brightness=BRIGHTNESS\tBrightness of resulting image\n");
215        fprintf(STDERR, "  -c, --contrast=CONTRAST\tContrast of resulting image\n");
216        fprintf(STDERR, "  -g, --gamma=GAMMA\t\tGamma of resulting image\n");
217        fprintf(STDERR, "  -d, --dither=DITHER\t\tDithering algorithm to use :\n");
218        $list = caca_get_dither_algorithm_list(caca_create_dither(imagecreate(1, 1)));
219        foreach($list as $type => $name)
220        {
221                fprintf(STDERR, "\t\t\t%s: %s\n", $type, $name);
222        }
223
224        fprintf(STDERR, "  -f, --format=FORMAT\t\tFormat of the resulting image :\n");
225        $list = caca_get_export_list();
226        foreach($list as $type => $name)
227        {
228                fprintf(STDERR, "\t\t\t%s: %s\n", $type, $name);
229        }
230}
231
232function version()
233{
234        printf(
235        "img2txt Copyright 2006-2007 Sam Hocevar and Jean-Yves Lamoureux\n" .
236        "        Copyright 2008 Benjamin C. Wiley Sittler\n" .
237        "Internet: <sam@zoy.org> <jylam@lnxscene.org> <bsittler@gmail.com> Version: %s\n" .
238        "\n" .
239        "img2txt, along with its documentation, may be freely copied and distributed.\n" .
240        "\n" .
241        "The latest version of img2txt is available from the web site,\n" .
242        "        http://caca.zoy.org/wiki/libcaca in the libcaca package.\n" .
243        "\n",
244        caca_get_version());
245}
246function main()
247{
248        global $argc, $argv;
249        $cols = 0;
250        $lines = 0;
251        $font_width = 6;
252        $font_height = 10;
253        $format = NULL;
254        $dither = NULL;
255        $gamma = $brightness = $contrast = -1.0;
256
257        $long_options = array(
258                "width:"        => 'W',
259                "height:"       => 'H',
260                "font-width:"   => 'x',
261                "font-height:"  => 'y',
262                "format:"       => 'f',
263                "dither:"       => 'd',
264                "gamma:"        => 'g',
265                "brightness:"   => 'b',
266                "contrast:"     => 'c',
267                "help"          => 'h',
268                "version"       => 'v'
269                );
270
271        try {
272                while($opt_and_arg = mygetopt("W:H:f:d:g:b:c:hvx:y:", array_keys($long_options)))
273                {
274                        $opt = $opt_and_arg[0];
275                        $arg = $opt_and_arg[1];
276                        if((substr($opt, 0, 2) == '--')
277                                &&
278                                array_key_exists(substr($opt, strlen('--')) . (($arg !== NULL) ? ':' : ''), $long_options))
279                        {
280                                $opt = '-' . $long_options[substr($opt, strlen('--')) . (($arg !== NULL) ? ':' : '')];
281                        }
282                        switch($opt)
283                        {
284                        case '-W': /* --width */
285                                $cols = intval($arg);
286                                break;
287                        case '-H': /* --height */
288                                $lines = intval($arg);
289                                break;
290                        case '-x': /* --width */
291                                $font_width = intval($arg);
292                                break;
293                        case '-y': /* --height */
294                                $font_height = intval($arg);
295                                break;
296                        case '-f': /* --format */
297                                $format = $arg;
298                                break;
299                        case '-d': /* --dither */
300                                $dither = $arg;
301                                break;
302                        case '-g': /* --gamma */
303                                $gamma = floatval($arg);
304                                break;
305                        case '-b': /* --brightness */
306                                $brightness = floatval($arg);
307                                break;
308                        case '-c': /* --contrast */
309                                $contrast = floatval($arg);
310                                break;
311                        case '-h': /* --help */
312                                usage($argc, $argv);
313                                return 0;
314                        case '-v': /* --version */
315                                version();
316                                return 0;
317                        default:
318                                return 1;
319                        }
320                }
321        }
322        catch (MygetoptException $e)
323        {
324                fprintf(STDERR, "%s", $argv[0] . ": " . $e->getMessage() . "\n");
325                usage($argc, $argv);
326                return 2;
327        }
328
329        if($argc != 2)
330        {
331                fprintf(STDERR, "%s: wrong argument count\n", $argv[0]);
332                usage($argc, $argv);
333                return 1;
334        }
335
336        $cv = caca_create_canvas(0, 0);
337        if(!$cv)
338        {
339                fprintf(STDERR, "%s: unable to initialise libcaca\n", $argv[0]);
340                return 1;
341        }
342
343        $i_str = file_get_contents($argv[$argc-1]);
344        $i = $i_str ? imagecreatefromstring($i_str) : NULL;
345        if(!$i)
346        {
347                fprintf(STDERR, "%s: unable to load %s\n", $argv[0], $argv[$argc-1]);
348                return 1;
349        }
350
351        /* Assume a 6×10 font */
352        if(!$cols && !$lines)
353        {
354                $cols = 60;
355                $lines = $cols * imagesy($i) * $font_width / imagesx($i) / $font_height;
356        }
357        else if($cols && !$lines)
358        {
359                $lines = $cols * imagesy($i) * $font_width / imagesx($i) / $font_height;
360        }
361        else if(!$cols && $lines)
362        {
363                $cols = $lines * imagesx($i) * $font_height / imagesy($i) / $font_width;
364        }
365
366
367        caca_set_canvas_size($cv, $cols, $lines);
368        caca_set_color_ansi($cv, CACA_DEFAULT, CACA_TRANSPARENT);
369        caca_clear_canvas($cv);
370        $i_dither = caca_create_dither($i);
371        if(! caca_set_dither_algorithm($i_dither, $dither?$dither:"fstein"))
372        {
373                fprintf(STDERR, "%s: Can't dither image with algorithm '%s'\n", $argv[0], $dither?$dither:"fstein");
374                return -1;
375        }
376
377        if($brightness!=-1) caca_set_dither_brightness ($i_dither, $brightness);
378        if($contrast!=-1) caca_set_dither_contrast ($i_dither, $contrast);
379        if($gamma!=-1) caca_set_dither_gamma ($i_dither, $gamma);
380
381        caca_dither_bitmap($cv, 0, 0, $cols, $lines, $i_dither, $i);
382
383        $export = caca_export_string($cv, $format?$format:"ansi");
384        if(!$export)
385        {
386                fprintf(STDERR, "%s: Can't export to format '%s'\n", $argv[0], $format?$format:"ansi");
387                return -1;
388        }
389        else
390        {
391                echo $export;
392        }
393
394        return 0;
395}
396exit(main());
397?>
Note: See TracBrowser for help on using the repository browser.