使用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美术作品,既将其保存为文本文件以供分享,也将其直接打印到控制台以获得即时满足感。
本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-91534-0.html用Rust和OpenCV打造ASCII图片
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
下一篇: 打造高可用系统:深入了解心跳检测机制