当前位置:首页 > 科技  > 软件

用Rust和OpenCV打造ASCII图片

来源: 责编: 时间:2024-05-29 17:32:31 263观看
导读使用Rust和OpenCV的动态组合,将任何旧图片变成一个炙手可热的ASCII艺术图片。想象文字像像素一样跳舞,在纯文本的基础上捕捉图像的本质。图片OpenCV下载地址:https://opencv.org/releases/.创建一个Rust项目:cargo new im

使用Rust和OpenCV的动态组合,将任何旧图片变成一个炙手可热的ASCII艺术图片。想象文字像像素一样跳舞,在纯文本的基础上捕捉图像的本质。J4L28资讯网——每日最新资讯28at.com

图片图片J4L28资讯网——每日最新资讯28at.com

OpenCV下载地址:https://opencv.org/releases/.J4L28资讯网——每日最新资讯28at.com

创建一个Rust项目:J4L28资讯网——每日最新资讯28at.com

cargo new img-to-ascii

J4L28资讯网——每日最新资讯28at.com

在Cargo.toml文件中,加入以下依赖项:J4L28资讯网——每日最新资讯28at.com

[dependencies]opencv = "0.88.5"

J4L28资讯网——每日最新资讯28at.com

将下面的图片存储在项目的根目录下:J4L28资讯网——每日最新资讯28at.com

图片图片J4L28资讯网——每日最新资讯28at.com

第一步,读取图片,然后灰度化J4L28资讯网——每日最新资讯28at.com

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();}

J4L28资讯网——每日最新资讯28at.com

这段代码使用OpenCV读取图像并将其转换为灰度,为我们的ASCII艺术创作奠定了基础。J4L28资讯网——每日最新资讯28at.com

第二步,缩放和调整大小。J4L28资讯网——每日最新资讯28at.com

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();}

J4L28资讯网——每日最新资讯28at.com

在这里,我们要确保我们的ASCII图片不会太压扁或拉伸,通过代码计算最佳比例因子并相应地调整图像的大小。J4L28资讯网——每日最新资讯28at.com

第三步,ASCII转换。J4L28资讯网——每日最新资讯28at.com

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');    }}

J4L28资讯网——每日最新资讯28at.com

我们定义了一个ASCII字符的调色板,并将每个像素的强度映射到一个字符,从而创建了基于文本的图像。J4L28资讯网——每日最新资讯28at.com

第四步,生成ASCII图片。J4L28资讯网——每日最新资讯28at.com

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!");}

J4L28资讯网——每日最新资讯28at.com

执行以下命令运行程序:J4L28资讯网——每日最新资讯28at.com

cargo run R.png

J4L28资讯网——每日最新资讯28at.com

最后,呈现了我们的ASCII美术作品,既将其保存为文本文件以供分享,也将其直接打印到控制台以获得即时满足感。J4L28资讯网——每日最新资讯28at.com

J4L28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-91534-0.html用Rust和OpenCV打造ASCII图片

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Spring 中如何控制 Bean 的加载顺序?

下一篇: 打造高可用系统:深入了解心跳检测机制

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 华为HarmonyOS 4.0将于8月4日发布 或搭载AI大模型技术

    华为宣布HarmonyOS4.0将于8月4日正式发布。此前,华为已经针对开发者公布了HarmonyOS4.0,以便于开发者提前进行适配,也因此被曝光出了一些新系统的特性
  • 7月4日见!iQOO 11S官宣:“鸡血版”骁龙8 Gen2+200W快充加持

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
Top