///usr/bin/env jbang "$0" "$@" ; exit $? //DEPS org.codejive.miniterm:miniterm${miniterm.ffm:}:${miniterm.version:0.2.0} //DEPS org.codejive.miniterm:image:${miniterm.version:0.2.0} package examples; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Locale; import javax.imageio.ImageIO; import org.codejive.miniterm.Terminal; import org.codejive.miniterm.image.ImageEncoder; import org.codejive.miniterm.image.ImageEncoders; /** * Demo application showing how to use the terminal image encoding framework. * *
This example demonstrates rendering images to the terminal using different encoders (Sixel, * Kitty, iTerm2, and block-based Unicode rendering). * *
Usage: {@code ShowImage [--image= Supported encoder names: sixel, kitty, iterm2, block-full, block-half, block-quadrant,
* block-sextant, block-octant.
*/
public class ShowImage {
public static void main(String[] args) throws Exception {
try (Terminal terminal = Terminal.create()) {
BufferedImage image = loadImage(args);
// Define target size in terminal rows/columns
int targetWidth = 20; // 20 columns wide
int targetHeight = 10; // 10 rows tall
terminal.write("=== Image Encoder Demo ===\n");
boolean fitImage = true;
String encoderName = getEncoderArg(args);
if (encoderName != null) {
// Use a specific encoder requested via --encoder=
ImageEncoder.Provider provider = findProvider(encoderName);
if (provider == null) {
terminal.write("Unknown encoder: " + encoderName + "\n");
terminal.write(
"Available: sixel, kitty, iterm2, block-full, block-half,"
+ " block-quadrant, block-sextant, block-octant\n");
return;
}
terminal.write("Using encoder: " + provider.name() + "\n\n");
terminal.write("Rendering with " + provider.name() + " encoder:\n");
renderImage(provider.create(image, targetWidth, targetHeight, fitImage), terminal);
terminal.write("\n\n");
} else {
// Detect the best encoder for the current terminal
ImageEncoder.Provider bestProvider = ImageEncoders.best();
ImageEncoder detectedEncoder =
bestProvider.create(image, targetWidth, targetHeight, fitImage);
terminal.write("Detected encoder: " + bestProvider.name() + "\n\n");
// Try rendering with the detected encoder
terminal.write("Rendering with " + bestProvider.name() + " encoder:\n");
renderImage(detectedEncoder, terminal);
terminal.write("\n\n");
// Optionally try all available encoders
if (shouldTestAllEncoders(args)) {
terminal.write("\n--- Testing all encoders ---\n\n");
for (ImageEncoder.Provider provider : ImageEncoders.providers()) {
testEncoder(
provider.name(),
provider.create(image, targetWidth, targetHeight, fitImage),
terminal);
}
}
}
terminal.write("\nDemo complete!\n");
}
}
private static String getEncoderArg(String[] args) {
for (String arg : args) {
if (arg.startsWith("--encoder=")) {
return arg.substring("--encoder=".length());
}
}
return null;
}
private static BufferedImage loadImage(String[] args) throws IOException {
String imagePath = getImageArg(args);
if (imagePath == null) {
return createTestImage(200, 150);
}
BufferedImage image = ImageIO.read(new File(imagePath));
if (image == null) {
throw new IOException("Unsupported or unreadable image: " + imagePath);
}
return image;
}
private static String getImageArg(String[] args) {
for (int i = 0; i < args.length; i++) {
String arg = args[i];
if (arg.startsWith("--image=")) {
return arg.substring("--image=".length());
}
if ("--image".equals(arg)) {
if (i + 1 >= args.length) {
throw new IllegalArgumentException("Missing value for --image");
}
return args[i + 1];
}
}
return null;
}
private static ImageEncoder.Provider findProvider(String name) {
String normalized = normalizeProviderName(name);
List