Compare commits

..

No commits in common. "develop" and "v1.3.1" have entirely different histories.

3 changed files with 29 additions and 53 deletions

View File

@ -2,10 +2,10 @@
*img2irc* is a premiere command-line utility which converts images to irc/ansi art, with a lot of post-processing filters
`$ img2irc https://i.imgur.com/qP1uBCK.png`
`$ img2irc https://i.imgur.com/WWSl2Sb.png --render ansi --blocks --width 132 --contrast 50 --nograyscale`
>  
>![img2irc block example](https://i.imgur.com/ew513lc.png)
>![img2irc block example](https://i.imgur.com/B9syzEm.png)
>  
# how to install
@ -31,30 +31,6 @@
> [!NOTE]
> if you like this project, i would appreciate you giving it a vote on the [aur](https://aur.archlinux.org/packages/img2irc-bin)!
# font installation (recommended)
certain glyph types (triangle, corner, geometric, box, legacy) require google's noto fonts extras to render correctly. full, half, quarter and eighth blocks typically work without extra fonts.
## debian/ubuntu
```bash
sudo apt update
sudo apt install fonts-noto
```
## arch linux
```bash
sudo pacman -S noto-fonts noto-fonts-extra
```
## windows
1. download the latest noto-fonts zip from https://github.com/googlefonts/noto-fonts/releases/latest
2. extract the archive
3. install the .ttf files you need (e.g., noto sans symbols, noto sans symbols 2) by right-clicking → install, or copy them to c:\windows\fonts
# usage
`img2irc <URL or PATH> [OPTIONS]`
@ -73,9 +49,9 @@ sudo pacman -S noto-fonts noto-fonts-extra
### colours rendering modes
| option | description | default |
|----------------------------------------|-----------------------------|------------------|
| --render | colour rendering mode | `ansi` |
| option | description |
|----------------------------------------|---------------------------------------------------------------|
| --render | colour rendering mode (default: `irc`) |
`irc` mode has 99 colours, (6.62-bit)
@ -83,22 +59,22 @@ sudo pacman -S noto-fonts noto-fonts-extra
`ansi24` has 16777216 colours (24-bit)
### pixel rendering modes
### pixel rendering modes (select one)
| option | description | default |
|---------------|-------------------------------|--------------|
| `--braille` | use braille pixels | `false` |
| `--blocks[=types]` | use block pixels of the provided types | `full,half,quarter,eighth,triangle,corner,geometric,box,legacy` |
| option | description |
|---------------|-------------------------------|
| `--braille` | use braille pixels |
| `--blocks[=types]` | use block pixels of the provided types. defaults to `full,half,quarter,eighth,triangle,corner,geometric,box,legacy` |
#### braille mode
`--braille` uses 2×4 braille dot patterns, doubling horizontal and quadrupling vertical resolution
`--braille` uses 2×4 braille dot patterns, doubling horizontal and octupling vertical resolution
#### block modes
| type | description | unicode range |
|-----------|----------------------|----------------|
| `full` | full block | 0x20 + 0x2588 |
| `full` | full block | 0x2588 |
| `half` | half block | 0x2580-0x2590 |
| `quarter` | quarter block | 0x2596-0x259F |
| `eighth` | eighth block | 0x2581-0x2595 |
@ -110,7 +86,7 @@ sudo pacman -S noto-fonts noto-fonts-extra
specifying `--blocks` with no value uses all available glyph types
`full` only uses the ASCII space and fullblock glyph
`full` only uses the fullblock glyph
`half` increases the vertical resolution twofold
@ -126,8 +102,6 @@ specifying `--blocks` with no value uses all available glyph types
`box` uses some box-drawing characters
`legacy` uses some legacy geometric shapes
> see `src/chars.rs` for the actual glyphs and bitmaps or read `utils/README.md` for information on how to generate a custom `chars.rs` file
### image processing options
@ -175,5 +149,3 @@ specifying `--blocks` with no value uses all available glyph types
| --frostedglass | blurred, frosted appearance as if viewed through semi-transparent surface | false |
| --solarize | strange, otherworldly appearance with inverted colors and surreal atmosphere | false |
| --edgedetection | highlights edges and boundaries in an image | false |
![img2irc example 2](https://i.imgur.com/BWs5Hfd.png)

View File

@ -77,7 +77,7 @@ pub struct Args {
pub flipv: bool,
/// colour mode to use
#[arg(long, value_enum, default_value_t = Render::Ansi)]
#[arg(long, value_enum, default_value_t = Render::Irc)]
pub render: Render,
/// use braille pixels
@ -85,6 +85,7 @@ pub struct Args {
long,
default_value_t = false,
conflicts_with = "block",
required_unless_present = "blocks"
)]
pub braille: bool,
@ -94,7 +95,7 @@ pub struct Args {
value_enum,
value_delimiter = ',',
num_args = 0..,
default_values = &[
default_missing_values = &[
"full",
"half",
"quarter",
@ -106,6 +107,7 @@ pub struct Args {
"legacy",
],
conflicts_with = "braille",
required_unless_present = "braille"
)]
pub blocks: Vec<BlockKind>,

View File

@ -15,23 +15,25 @@ async fn main() {
match load_image_from_url_or_path(args.image.as_str()).await {
Ok(image) => {
let image_luma = effects::apply_luma_effects(&args, image.clone());
let image_chroma = effects::apply_effects(&args, image.clone());
let image = effects::apply_effects(&args, image.clone());
let canvas = draw::AnsiImage::new(image.clone());
let canvas_luma = draw::AnsiImage::new(image_luma.clone());
let canvas_chroma = draw::AnsiImage::new(image_chroma.clone());
if args.braille {
let image_luma = effects::apply_luma_effects(&args, image.clone());
let canvas_luma = draw::AnsiImage::new(image_luma.clone());
// Braille rendering
match args.render {
args::Render::Irc => println!("{}", draw::render_braille(&canvas_luma, &canvas, &args, args::Render::Irc)),
args::Render::Ansi => println!("{}", draw::render_braille(&canvas_luma, &canvas, &args, args::Render::Ansi)),
args::Render::Ansi24 => println!("{}", draw::render_braille(&canvas_luma, &canvas, &args, args::Render::Ansi24)),
args::Render::Irc => println!("{}", draw::render_braille(&canvas_luma, &canvas_chroma, &args, args::Render::Irc)),
args::Render::Ansi => println!("{}", draw::render_braille(&canvas_luma, &canvas_chroma, &args, args::Render::Ansi)),
args::Render::Ansi24 => println!("{}", draw::render_braille(&canvas_luma, &canvas_chroma, &args, args::Render::Ansi24)),
}
} else {
// Block rendering
match args.render {
args::Render::Irc => println!("{}", draw::render_blocks(&canvas, &args, args::Render::Irc)),
args::Render::Ansi => println!("{}", draw::render_blocks(&canvas, &args, args::Render::Ansi)),
args::Render::Ansi24 => println!("{}", draw::render_blocks(&canvas, &args, args::Render::Ansi24)),
args::Render::Irc => println!("{}", draw::render_blocks(&canvas_chroma, &args, args::Render::Irc)),
args::Render::Ansi => println!("{}", draw::render_blocks(&canvas_chroma, &args, args::Render::Ansi)),
args::Render::Ansi24 => println!("{}", draw::render_blocks(&canvas_chroma, &args, args::Render::Ansi24)),
}
}
}