用Rust和OpenCV打造ASCII图片

​使用Rust和OpenCV的动态组合,将任何旧图片变成一个炙手可热的ASCII艺术图片。想象文字像像素一样跳舞,在纯文本的基础上捕捉图像的本质。

​使用Rust和OpenCV的动态组合,将任何旧图片变成一个炙手可热的ASCII艺术图片。想象文字像像素一样跳舞,在纯文本的基础上捕捉图像的本质。

使用Rust和OpenCV的动态组合,将任何旧图片变成一个炙手可热的ASCII艺术图片。想象文字像像素一样跳舞,在纯文本的基础上捕捉图像的本质。

图片图片

OpenCV下载地址:https://opencv.org/releases/.

创建一个Rust项目:

cargo new img-to-ascii

在Cargo.toml文件中,加入以下依赖项:

[dependencies]
opencv = "0.88.5"

将下面的图片存储在项目的根目录下:

图片图片

第一步,读取图片,然后灰度化

use opencv::core;
use opencv::imgcodecs;
use opencv::imgproc;
use opencv::prelude::*;
use std::env;
use std::fs::File;
use std::io::Write;

fn main() {
    // 解析命令行参数
    let args: Vec<String> = env::args().collect();
    if args.len() < 2 {
        println!("Usage: {} <image>", args[0]);
        return;
    }

    // 读取图像文件
    let image = imgcodecs::imread(args[1].as_str(), imgcodecs::IMREAD_COLOR).unwrap();

    // 转换为灰度
    let mut gray_image = Mat::default();
    imgproc::cvt_color(&image, &mut gray_image, imgproc::COLOR_BGR2GRAY, 0).unwrap();
}

这段代码使用OpenCV读取图像并将其转换为灰度,为我们的ASCII艺术创作奠定了基础。

第二步,缩放和调整大小。

use opencv::core;
use opencv::imgcodecs;
use opencv::imgproc;
use opencv::prelude::*;
use std::env;
use std::fs::File;
use std::io::Write;

fn main() {
    ......

    // 设置所需宽度或高度
    let desired_width = 150;
    let desired_height = 150;

    // 在保持长宽比的同时计算比例因子
    let scale_w = desired_width as f64 / image.cols() as f64;
    let scale_h = desired_height as f64 / image.rows() as f64;
    let scale = scale_w.min(scale_h);

    let new_width = (image.cols() as f64 * scale) as i32;
    let new_height = (image.rows() as f64 * scale) as i32;

    // 调整图像大小
    let mut resized = Mat::default();

    imgproc::resize(
        &gray_image,
        &mut resized,
        core::Size::new(new_width, new_height),
        0.0,
        0.0,
        imgproc::INTER_LINEAR,
    )
    .unwrap();
}

在这里,我们要确保我们的ASCII图片不会太压扁或拉伸,通过代码计算最佳比例因子并相应地调整图像的大小。

第三步,ASCII转换。

use opencv::core;
use opencv::imgcodecs;
use opencv::imgproc;
use opencv::prelude::*;
use std::env;
use std::fs::File;
use std::io::Write;

fn main() {
    ......

    // ASCII转换
    // 更多的字符表示更精细的细节
    // <$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\|()1{}[]?-_+~<>i!lI;:,\"^`'. >
    let ascii_chars = " .,:;i1tfLCG08@";

    let mut ascii_art = String::new();

    for i in 0..resized.rows() {
        for j in 0..resized.cols() {
            let pixel = resized.at_2d::<u8>(i, j).unwrap();
            let ascii_index = *pixel as usize * ascii_chars.len() / 256;
            ascii_art.push(ascii_chars.chars().nth(ascii_index).unwrap_or(' '));
        }
        ascii_art.push('\n');
    }
}

我们定义了一个ASCII字符的调色板,并将每个像素的强度映射到一个字符,从而创建了基于文本的图像。

第四步,生成ASCII图片。

use opencv::core;
use opencv::imgcodecs;
use opencv::imgproc;
use opencv::prelude::*;
use std::env;
use std::fs::File;
use std::io::Write;

fn main() {
    ......

    // 保存ASCII图像文件
    let mut file = File::create(format!(
        "{}.txt",
        args[1].split('.').collect::<Vec<&str>>()[0]
    ))
    .unwrap();
    file.write_all(ascii_art.as_bytes()).unwrap();

    // 打印ASCII图像到控制台
    println!("{}", ascii_art);

    println!("Done!");
}

执行以下命令运行程序:

cargo run R.png

最后,呈现了我们的ASCII美术作品,既将其保存为文本文件以供分享,也将其直接打印到控制台以获得即时满足感。

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
打造高可用系统:深入了解心跳检测机制
上一篇 2024年5月29日 17:02
下一篇 2024年5月29日 17:02

相关推荐

发表回复

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信