@@ -62,12 +62,6 @@ public class ImageBanner implements Banner {
62
62
63
63
private static final double [] RGB_WEIGHT = { 0.2126d , 0.7152d , 0.0722d };
64
64
65
- private static final char [] PIXEL = { ' ' , '.' , '*' , ':' , 'o' , '&' , '8' , '#' , '@' };
66
-
67
- private static final int LUMINANCE_INCREMENT = 10 ;
68
-
69
- private static final int LUMINANCE_START = LUMINANCE_INCREMENT * PIXEL .length ;
70
-
71
65
private final Resource image ;
72
66
73
67
public ImageBanner (Resource image ) {
@@ -104,12 +98,13 @@ private void printBanner(Environment environment, PrintStream out) throws IOExce
104
98
int margin = getProperty (environment , "margin" , Integer .class , 2 );
105
99
boolean invert = getProperty (environment , "invert" , Boolean .class , false );
106
100
BitDepth bitDepth = getBitDepthProperty (environment );
101
+ PixelMode pixelMode = getPixelModeProperty (environment );
107
102
Frame [] frames = readFrames (width , height );
108
103
for (int i = 0 ; i < frames .length ; i ++) {
109
104
if (i > 0 ) {
110
105
resetCursor (frames [i - 1 ].getImage (), out );
111
106
}
112
- printBanner (frames [i ].getImage (), margin , invert , bitDepth , out );
107
+ printBanner (frames [i ].getImage (), margin , invert , bitDepth , pixelMode , out );
113
108
sleep (frames [i ].getDelayTime ());
114
109
}
115
110
}
@@ -119,6 +114,11 @@ private BitDepth getBitDepthProperty(Environment environment) {
119
114
return (bitDepth != null ) ? BitDepth .of (bitDepth ) : BitDepth .FOUR ;
120
115
}
121
116
117
+ private PixelMode getPixelModeProperty (Environment environment ) {
118
+ String pixelMode = getProperty (environment , "pixelmode" , String .class , null );
119
+ return (pixelMode != null ) ? PixelMode .valueOf (pixelMode .trim ().toUpperCase ()) : PixelMode .TEXT ;
120
+ }
121
+
122
122
private <T > T getProperty (Environment environment , String name , Class <T > targetType , T defaultValue ) {
123
123
return environment .getProperty (PROPERTY_PREFIX + name , targetType , defaultValue );
124
124
}
@@ -197,7 +197,8 @@ private void resetCursor(BufferedImage image, PrintStream out) {
197
197
out .print ("\033 [" + lines + "A\r " );
198
198
}
199
199
200
- private void printBanner (BufferedImage image , int margin , boolean invert , BitDepth bitDepth , PrintStream out ) {
200
+ private void printBanner (BufferedImage image , int margin , boolean invert , BitDepth bitDepth , PixelMode pixelMode ,
201
+ PrintStream out ) {
201
202
AnsiElement background = invert ? AnsiBackground .BLACK : AnsiBackground .DEFAULT ;
202
203
out .print (AnsiOutput .encode (AnsiColor .DEFAULT ));
203
204
out .print (AnsiOutput .encode (background ));
@@ -216,7 +217,7 @@ private void printBanner(BufferedImage image, int margin, boolean invert, BitDep
216
217
out .print (AnsiOutput .encode (ansiColor ));
217
218
lastColor = ansiColor ;
218
219
}
219
- out .print (getAsciiPixel (color , invert ));
220
+ out .print (getAsciiPixel (color , invert , pixelMode ));
220
221
}
221
222
out .println ();
222
223
}
@@ -225,14 +226,17 @@ private void printBanner(BufferedImage image, int margin, boolean invert, BitDep
225
226
out .println ();
226
227
}
227
228
228
- private char getAsciiPixel (Color color , boolean dark ) {
229
+ private char getAsciiPixel (Color color , boolean dark , PixelMode pixelMode ) {
230
+ char [] pixels = pixelMode .getPixels ();
231
+ int increment = (10 / pixels .length ) * 10 ;
232
+ int start = increment * pixels .length ;
229
233
double luminance = getLuminance (color , dark );
230
- for (int i = 0 ; i < PIXEL .length ; i ++) {
231
- if (luminance >= (LUMINANCE_START - (i * LUMINANCE_INCREMENT ))) {
232
- return PIXEL [i ];
234
+ for (int i = 0 ; i < pixels .length ; i ++) {
235
+ if (luminance >= (start - (i * increment ))) {
236
+ return pixels [i ];
233
237
}
234
238
}
235
- return PIXEL [ PIXEL .length - 1 ];
239
+ return pixels [ pixels .length - 1 ];
236
240
}
237
241
238
242
private int getLuminance (Color color , boolean inverse ) {
@@ -277,4 +281,31 @@ int getDelayTime() {
277
281
278
282
}
279
283
284
+ /**
285
+ * Pixel modes supported by the image banner.
286
+ */
287
+ public enum PixelMode {
288
+
289
+ /**
290
+ * Use text chars for pixels.
291
+ */
292
+ TEXT (' ' , '.' , '*' , ':' , 'o' , '&' , '8' , '#' , '@' ),
293
+
294
+ /**
295
+ * Use unicode block chars for pixels.
296
+ */
297
+ BLOCK (' ' , '\u2591' , '\u2592' , '\u2593' , '\u2588' );
298
+
299
+ private char [] pixels ;
300
+
301
+ PixelMode (char ... pixels ) {
302
+ this .pixels = pixels ;
303
+ }
304
+
305
+ char [] getPixels () {
306
+ return this .pixels ;
307
+ }
308
+
309
+ }
310
+
280
311
}
0 commit comments