Comment by wonger_

13 hours ago

Great breakdown and visuals. Most ASCII filters do not account for glyph shape.

It reminds me of how chafa uses an 8x8 bitmap for each glyph: https://github.com/hpjansson/chafa/blob/master/chafa/interna...

There's a lot of nitty gritty concerns I haven't dug into: how to make it fast, how to handle colorspaces, or like the author mentions, how to exaggerate contrast for certain scenes. But I think 99% of the time, it will be hard to beat chafa. Such a good library.

EDIT - a gallery of (Unicode-heavy) examples, in case you haven't seen chafa yet: https://hpjansson.org/chafa/gallery/

Aha! The 8x8 bitmap approach is the one I used back in college. I was using a fixed font, so I just converted each character to a 64-bit integer and then used popcnt to compare with an 8x8 tile from the image. I wonder whether this approach results in meaningfully different image results from the original post? e.g. focusing on directionality rather than bitmap match might result in more legible large shapes, but fine noise may not be reproduced as faithfully.

But the chafa gallery isn't showing off ascii text rendering. Are there examples that use ascii text?

  • Good point. I haven't found many ascii examples online.

    Here's a copy-paste snippet where you can try chafa-ascii-fying images in your own terminal, if you have uvx:

      uvx --with chafa-py python -c '
      from chafa import * 
      from chafa.loader import Loader 
      import sys 
      img = Loader(sys.argv[1])
      config = CanvasConfig() 
      config.calc_canvas_geometry(img.width,img.height,0.5,True,False)
      symbol_map = SymbolMap()
      symbol_map.add_by_tags(SymbolTags.CHAFA_SYMBOL_TAG_ASCII)
      config.set_symbol_map(symbol_map)
      config.canvas_mode = CanvasMode.CHAFA_CANVAS_MODE_FGBG
      canvas = Canvas(config)
      canvas.draw_all_pixels(img.pixel_type,img.get_pixels(),img.width,img.height,img.rowstride)
      print(canvas.print().decode())
      ' \
      myimage.jpg
    

    But results are not as good as the OP's work. https://wonger.dev/assets/chafa-ascii-examples.png So I'll revise my claim that chafa is great for unicodey colorful environments, but hand-tailored ascii-only work like the OP is worth the effort.