diff --git a/src/main/java/TerminalImageViewer.java b/src/main/java/TerminalImageViewer.java index ed5c251..2454cda 100644 --- a/src/main/java/TerminalImageViewer.java +++ b/src/main/java/TerminalImageViewer.java @@ -1,7 +1,9 @@ import java.awt.Graphics2D; import java.awt.image.BufferedImage; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.io.InputStreamReader; import java.net.URL; import java.util.Arrays; import java.util.regex.Matcher; @@ -16,6 +18,11 @@ import javax.imageio.ImageIO; */ public class TerminalImageViewer { + static boolean grayscale = false; + static int mode = Ansi.MODE_24BIT; + static boolean html = false; + + /** * Main method, handles command line arguments and loads and scales images. */ @@ -23,15 +30,15 @@ public class TerminalImageViewer { if (args.length == 0) { System.out.println( "Image file name required.\n\n - Use -w and -h to set the maximum width and height in characters" + - " (defaults: 80, 24).\n - Use -256 for 256 color mode and -grayscale for grayscale.\n"); + " (defaults: 80, 24).\n - Use -256 for 256 color mode, -grayscale for grayscale and -stdin to" + + " obtain file names from stdin.\n"); return; } int start = 0; int maxWidth = 80; int maxHeight = 24; - int mode = Ansi.MODE_24BIT; - boolean grayscale = false; + boolean stdin = false; while (start < args.length && args[start].startsWith("-")) { String option = args[start]; if (option.equals("-w") && args.length > start + 1) { @@ -42,6 +49,10 @@ public class TerminalImageViewer { mode = (mode & ~Ansi.MODE_24BIT) | Ansi.MODE_256; } else if (option.equals("-grayscale")) { grayscale = true; + } else if (option.equals("-html")) { + html = true; + } else if (option.equals("-stdin")) { + stdin = true; } start++; } @@ -49,25 +60,17 @@ public class TerminalImageViewer { maxWidth *= 4; maxHeight *= 8; - if (start == args.length - 1 && (isUrl(args[start]) || !new File(args[start]).isDirectory())) { - String name = args[start]; - - BufferedImage original = loadImage(name); - - float originalWidth = original.getWidth(); - float originalHeight = original.getHeight(); - float scale = Math.min(maxWidth / originalWidth, maxHeight / originalHeight); - int height = (int) (originalHeight * scale); - int width = (int) (originalWidth * scale); - - if (originalWidth == width && !grayscale) { - dump(original, mode); - } else { - BufferedImage image = new BufferedImage(width, height, grayscale ? BufferedImage.TYPE_BYTE_GRAY : BufferedImage.TYPE_INT_RGB); - Graphics2D graphics = image.createGraphics(); - graphics.drawImage(original, 0, 0, width, height, null); - dump(image, mode); + if (stdin) { + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + while (true) { + String name = reader.readLine(); + if (name == null || name.isEmpty()) { + break; + } + convert(name, maxWidth, maxHeight); } + } else if (start == args.length - 1 && (isUrl(args[start]) || !new File(args[start]).isDirectory())) { + convert(args[start], maxWidth, maxHeight); } else { // Directory-style rendering. int index = 0; @@ -109,6 +112,25 @@ public class TerminalImageViewer { return name.startsWith("http://") || name.startsWith("https://"); } + static void convert(String name, int maxWidth, int maxHeight) throws IOException { + BufferedImage original = loadImage(name); + + float originalWidth = original.getWidth(); + float originalHeight = original.getHeight(); + float scale = Math.min(maxWidth / originalWidth, maxHeight / originalHeight); + int height = (int) (originalHeight * scale); + int width = (int) (originalWidth * scale); + + if (originalWidth == width && !grayscale) { + dump(original, mode); + } else { + BufferedImage image = new BufferedImage(width, height, grayscale ? BufferedImage.TYPE_BYTE_GRAY : BufferedImage.TYPE_INT_RGB); + Graphics2D graphics = image.createGraphics(); + graphics.drawImage(original, 0, 0, width, height, null); + dump(image, mode); + } + } + static BufferedImage loadImage(String name) throws IOException { if (isUrl(name)) { URL url = new URL(name); @@ -224,7 +246,7 @@ public class TerminalImageViewer { * Assumed bitmaps of the supported characters */ static int[] BITMAPS = new int[] { - 0x00000000, ' ', + 0x00000000, '\u00a0', // Block graphics @@ -480,10 +502,12 @@ public class TerminalImageViewer { sb.append(""); } sb.append(""); - - sb.append(blockChar.character); + last = style; + } + sb.append("&#" + ((int) blockChar.character) + ";"); pos += 16; } + sb.append("
\n"); } else { String lastFg = ""; String lastBg = ""; @@ -502,8 +526,7 @@ public class TerminalImageViewer { sb.append(blockChar.character); pos += 16; } - } - sb.append(Ansi.RESET).append("\n"); + sb.append(Ansi.RESET).append("\n"); } } return sb.toString();