Merge commit '712ddafb749aada41daab85c36ac12f657b2307e'
[nikiroo-utils.git] / main / img2aa.java
1 package be.nikiroo.utils.main;
2
3 import java.awt.Dimension;
4 import java.awt.image.BufferedImage;
5 import java.io.File;
6 import java.io.FileInputStream;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.util.ArrayList;
10 import java.util.List;
11
12 import be.nikiroo.utils.IOUtils;
13 import be.nikiroo.utils.Image;
14 import be.nikiroo.utils.ui.ImageTextAwt;
15 import be.nikiroo.utils.ui.ImageTextAwt.Mode;
16 import be.nikiroo.utils.ui.ImageUtilsAwt;
17
18 /**
19 * Image to ASCII conversion.
20 *
21 * @author niki
22 */
23 public class img2aa {
24 /**
25 * Syntax: (--mode=MODE) (--width=WIDTH) (--height=HEIGHT) (--size=SIZE)
26 * (--output=OUTPUT) (--invert) (--help)
27 * <p>
28 * See "--help".
29 *
30 * @param args
31 */
32 public static void main(String[] args) {
33 Dimension size = null;
34 Mode mode = null;
35 boolean invert = false;
36 List<String> inputs = new ArrayList<String>();
37 File output = null;
38
39 String lastArg = "";
40 try {
41 int height = -1;
42 int width = -1;
43
44 for (String arg : args) {
45 lastArg = arg;
46
47 if (arg.startsWith("--mode=")) {
48 mode = Mode.valueOf(arg.substring("--mode=".length()));
49 } else if (arg.startsWith("--width=")) {
50 width = Integer
51 .parseInt(arg.substring("--width=".length()));
52 } else if (arg.startsWith("--height=")) {
53 height = Integer.parseInt(arg.substring("--height="
54 .length()));
55 } else if (arg.startsWith("--size=")) {
56 String content = arg.substring("--size=".length()).replace(
57 "X", "x");
58 width = Integer.parseInt(content.split("x")[0]);
59 height = Integer.parseInt(content.split("x")[1]);
60 } else if (arg.startsWith("--ouput=")) {
61 if (!arg.equals("--output=-")) {
62 output = new File(arg.substring("--output=".length()));
63 }
64 } else if (arg.equals("--invert")) {
65 invert = true;
66 } else if (arg.equals("--help")) {
67 System.out
68 .println("Syntax: (--mode=MODE) (--width=WIDTH) (--height=HEIGHT) (--size=SIZE) (--output=OUTPUT) (--invert) (--help)");
69 System.out.println("\t --help: will show this screen");
70 System.out
71 .println("\t --invert: will invert the 'colours'");
72 System.out
73 .println("\t --mode: will select the rendering mode (default: ASCII):");
74 System.out
75 .println("\t\t ASCII: ASCI output mode, that is, characters \" .-+=o8#\"");
76 System.out
77 .println("\t\t DITHERING: Use 5 different \"colours\" which are actually"
78 + "\n\t\t Unicode characters \" ░▒▓█\"");
79 System.out
80 .println("\t\t DOUBLE_RESOLUTION: Use \"block\" Unicode characters up to quarter"
81 + "\n\t\t blocks, thus in effect doubling the resolution both in vertical"
82 + "\n\t\t and horizontal space."
83 + "\n\t\t Note that since 2 characters next to each other are square,"
84 + "\n\t\t 4 blocks per 2 blocks for w/h resolution.");
85 System.out
86 .println("\t\t DOUBLE_DITHERING: Use characters from both DOUBLE_RESOLUTION"
87 + "\n\t\t and DITHERING");
88 return;
89 } else {
90 inputs.add(arg);
91 }
92 }
93
94 size = new Dimension(width, height);
95 if (inputs.size() == 0) {
96 inputs.add("-"); // by default, stdin
97 }
98 } catch (Exception e) {
99 System.err.println("Syntax error: \"" + lastArg + "\" is invalid");
100 System.exit(1);
101 }
102
103 try {
104 if (mode == null) {
105 mode = Mode.ASCII;
106 }
107
108 for (String input : inputs) {
109 InputStream in = null;
110
111 try {
112 if (input.equals("-")) {
113 in = System.in;
114 } else {
115 in = new FileInputStream(input);
116 }
117 BufferedImage image = ImageUtilsAwt
118 .fromImage(new Image(in));
119 ImageTextAwt img = new ImageTextAwt(image, size, mode,
120 invert);
121 if (output == null) {
122 System.out.println(img.getText());
123 } else {
124 IOUtils.writeSmallFile(output, img.getText());
125 }
126 } finally {
127 if (!input.equals("-")) {
128 in.close();
129 }
130 }
131 }
132 } catch (IOException e) {
133 e.printStackTrace();
134 System.exit(2);
135 }
136 }
137 }