使用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 = env::args().collect();
if args.len() < 2 {
println!("Usage: {} ", 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转换
// 更多的字符表示更精细的细节
//