23 个不稳定版本 (6 个重大更改)

0.7.0-alpha.42024年3月11日
0.7.0-alpha.12024年2月20日
0.4.9 2023年7月16日
0.4.7 2022年11月14日

#171命令行工具

Download history 7/week @ 2024-05-19 1/week @ 2024-05-26 2/week @ 2024-07-07 123/week @ 2024-07-28

每月125 次下载

MIT 许可证

43KB
821

asciicast

aarty

在终端/TTY中渲染图片的小型框架。

crates.io docs.rs downloads license

示例

let cfg = Config::new(vec![' ', '.', ',', '-', '~', '!', '*', '%', '$', '@', '#'].into());

let image = image::open("mylove.jpg").unwrap();
let (w, h) = image.dimensions();

let mut out = BufWriter::with_capacity(cfg.calc_buf_size(w, h), io::stdout().lock());

convert_image_to_ascii(&cfg, &image, &mut out).expect("IO error");

启用前景颜色

let cfg = Config::new(vec![' ', '.', ',', '-', '~', '!', '*', '%'].into()).with_flags(COLORS);

// ...

使用背景颜色反转它们

let cfg = Config::new(Sympols::empty()).with_background((232, 209, 204)).with_flags(COLORS | REVERSE);

// ...

如果您想在内存中构建一个表示,以便您可以修改它或多次使用,那么您可能会发现为这种结构体实现 FragmentWriter 是有用的。

struct TerminalFrame {
    fragments: Vec<(char, ANSIColor)>,
   cfg: Config,
}

impl FragmentWriter for TerminalFrame {
    fn background(&mut self, _: &ANSIColor) -> Result<bool, Box<dyn std::error::Error>> {
        // Nah, I don't care, I have my configs :p
        //  but pretent like if you care so it will skip the swap operation.
        Ok(true)
    }

    fn write_fragment(&mut self, info: FragmentInfo) -> Result<(), Box<dyn std::error::Error>> {
        self.fragments.push((info.sym, info.fg));
        Ok(())
    }

    fn write_colored_fragment(
        &mut self,
        info: FragmentInfo,
        _: Option<&ANSIColor>,
        _: Option<&ANSIColor>,
    ) -> Result<(), Box<dyn std::error::Error>> {
        self.write_fragment(info)
    }

    fn write_bytes(&mut self, _bytes: &[u8]) -> Result<(), Box<dyn std::error::Error>> {
        // Just ignore them
        Ok(())
    }
}

// So you can use it as a buffer
let cfg = Config::new(vec!['I', 'L', 'O', 'V', 'E', 'U'].into()).with_flags(COLORS);

let image = image::open("mylove.jpg").unwrap();
let (w, h) = image.dimensions();
let mut frame = TerminalFrame {
    fragments: Vec::with_capacity(w as usize * h as usize),
    cfg: cfg.clone(),
};
aarty::convert_image_to_ascii(&cfg, &image, &mut frame).expect("Write error");
//  Do whatever you want with this object...

但请注意,这样做时,您将不得不在打印图片时(即渲染它时)实现渲染机制。

对于这种情况,我们提供了 TextImage,它基本上与上面的代码做同样的事情,但以更易于使用的方式,并且它实现了渲染机制,所以您可以直接打印它,它将正确渲染图像。您可以通过启用 text_image 功能来启用此类型,该功能默认启用。

text_image 功能还包括 ToTextImage 特性,它提供了一种构建 TextImage 对象的更易于使用的方法。

use aarty::ToTextImage;
let cfg = Config::new_with_background(Sympols::empty(), (232, 209, 204).into()).with_flags(COLORS | REVERSE);

let image = image::open("mylove.jpg").unwrap().to_text(cfg);
println!("{image}");

您必须启用 image 功能才能使此功能正常工作。

二进制文件

我们提供了一个简单的二进制文件,实现了此包的大部分功能。您可以使用构建命令构建它,或者如果您使用 cargo,则可以通过 cargo install aarty 安装它。

[!注意]有关二进制文件及其使用方法的更多信息,您可以运行 aarty --help 或查看此 match

贡献

我很高兴接受任何贡献,但请先阅读CONTRIBUTING.md指南。

主要关键词包括:签名提交常规提交无表情符号线性历史PR通常不应该包含超过三个提交

许可

本项目采用MIT许可

依赖关系图

deps graph

cargo-depgraph生成

依赖关系

~3MB
~56K SLoC