首页 > 其他分享 >RUST日常使用.md

RUST日常使用.md

时间:2024-03-06 15:58:48浏览次数:19  
标签:md use img exif mut image let 日常 RUST

RUST日常使用

Log日志

依赖:

[dependencies]
log = "0.4.20"
env_logger = "0.10.0"

一般使用:

// 使用RUST_LOG默认或环境变量
env_logger::Builder::from_env(Env::default().default_filter_or("warn")).init();

log::warn!("This is an example message.");

自定义日志格式化实现:

use env_logger::{Builder, Env};
use std::io::Write;

/// 初始化日志输出
/// json_format: 是否使用json格式进行输出
pub fn init_log() {
    let mut builder = Builder::from_env(Env::default().default_filter_or("info"));
    builder.format(|buf, record| {
        let message = record.args().to_string();
        let level = recors.level.as_str();
        writeln!(buf, "{} -- {}", level, message)
    });
    builder.init();
}

// 使用
#[cfg(test)]
mod tests {
    use log::{error};
    use crate::logs::init_log;
    #[test]
    fn test_log() {
        init_log();
        error!("测试");
    }
}

Clap命令行解析

依赖:

[dependencies]
clap = { version = "4.4.6", features = ["derive"] }

基本使用:

use clap::Parser;
use clap::ValueEnum;

/// Simple program to greet a person
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
    /// 源目录
    #[arg(short, long)]
    src_path: String,

    /// 目的目录
    #[arg(short, long)]
    dest_path: String,

    /// 支持的格式 为空表示支持所有格式
    #[arg(short, long)]
    format: Vec<PhotoSuffix>,

    /// 当图片没有exif时,是否使用文件的create time进行时间处理
    #[arg(short, long, default_value_t = false)]
    allow_no_exif: bool,
}

// 图片格式枚举
#[derive(Debug, Eq, Hash, PartialEq, ValueEnum, Clone)]
pub enum PhotoSuffix {
    WEBP,
    JPG,
    JPEG,
    PNG,
    TIFF,
    HEIF,
}

// 使用
fn main() {
    // 1. 命令行解析
    let arg = Args::parse();
}

条件编译

/// 判断两个文件是否为同一分区
/// 如果文件不存在,则会判断此文件所在的文件夹
/// 任何错误,都将返回false
/// 如果为同一分区,则返回true;否则,返回false
#[cfg(not(target_os = "linux"))]
fn same_partition(mut file1: PathBuf, mut file2: PathBuf) -> bool {
	// something
}

fn same_partition2(mut file1: PathBuf, mut file2: PathBuf) -> bool {
    if cfg!(target_os = "linux") {
        // something
    }
}

图片读取

依赖:

[dependencies]
image = { version = "0.24.8", features = ["webp-encoder"] }

使用:

use image::codecs::webp::{WebPEncoder, WebPQuality};
use image::EncodableLayout;
use image::io::Reader as ImageReader;

/// 转换图片为webp格式
pub fn convert(img_path: &str, tmp_file: &mut File) -> Result<()> {
    // 1. 解码图片数据
    let image = if img_path.starts_with("http") {
        let vec = Self::downloads_file(img_path)?;
        ImageReader::new(Cursor::new(vec)).with_guessed_format()?.decode()?
    } else {
        // 解码图片文件
        ImageReader::open(img_path)?.decode()?
    };

    // 2. 转换图片为webp格式
    let mut buf_writer = BufWriter::new(&tmp_file);
    let img_webp = WebPEncoder::new_with_quality(&mut buf_writer, WebPQuality::default());
    img_webp.encode(image.as_bytes(), image.width(), image.height(), image.color())?;

    // 3. 返回
    Ok(())
}

http客户端 - Curl

依赖:

[dependencies]
curl = "0.4.44"

简单下载:

use curl::easy::Easy;

fn downloads_file(url: &str) -> Result<Vec<u8>> {
    let mut buf = Vec::new();
    let mut handle = Easy::new();
    handle.url(url)?;
    handle.show_header(false)?;
    {
        let mut transfer = handle.transfer();
        transfer.write_function(|data| {
            buf.extend_from_slice(data);
            Ok(data.len())
        })?;
        transfer.perform()?;
    }
    Ok(buf)
}

图片exif读取

依赖:

[dependencies]
kamadak-exif = "0.5.5"

使用:

use exif::{DateTime, In, Reader, Tag, Value};
use chrono::{Local};
use anyhow::{Error, Result};

// 读取给定图片文件的exif信息,返回图片的创建时间 格式 2023-10-17
// allow_no_exif: 如果没有exif信息,是否使用图片文件的创建信息
pub fn read_datetime(img: &mut File, allow_no_exif: bool) -> Result<(String, String)> {
    // 1. 打开文件
    let metadata = img.metadata();
    let mut buf_reader = BufReader::new(img);

    // 2. 加载exif
    if let Ok(exif) = Reader::new().read_from_container(&mut buf_reader) {

        // 3. 读取datetime
        if let Some(field) = exif.get_field(Tag::DateTime, In::PRIMARY) {
            if let Value::Ascii(ref data) = field.value {
                if !data.is_empty() {
                    let datetime = DateTime::from_ascii(&data[0])?;
                    return Ok((datetime.year.to_string() ,format!("{}-{:02}-{:02}", datetime.year, datetime.month, datetime.day)));
                }
            }
        }
    }

    // 4. 否则返回文件最后修改时间
    let date = metadata?.created()?;
    if allow_no_exif {
        let dt: chrono::DateTime<Local> = date.into();
        return Ok((dt.format("%Y").to_string(), dt.format("%Y-%m-%d").to_string()));
    }

    return Err(Error::msg("无法获取图片拍摄信息!"));
}

标签:md,use,img,exif,mut,image,let,日常,RUST
From: https://www.cnblogs.com/nsfoxer/p/18056786

相关文章

  • 【UVM】 【source_code】 uvm_cmdline_processor
    classuvm_cmdline_processor 函数get_arg_values()用于收集命令行(commandline)中匹配的参数,便于后续处理。返回所有匹配上的参数数量,所有匹配上的参数词尾被存放在values[$]中。sourcecodefunctionintget_arg_values(stringmatch,refstringvalues[$]);  int......
  • Rust笔记(上)
    Rust笔记(上)目录Rust笔记(上)关于为什么最终还是选择了Rust作为主力语言基本数据类型所有权与移动所有权移动注意Rc与Arc:共享所有权引用共享引用可变引用生命周期省略生命周期表达式块与分号声明if与matchiflet循环break错误处理panicResult自定义错误类型结构体泛型结构体结构体自......
  • Reference management in Java and Rust, and, how faster Rust can be?
    Hi,thisisablogcomparingthereferenceinrustandjava.IreallylovejavaandIhavespendsometimelearningtheframeworklikespringandothers.AftertakingCOMP6991,Ihavegotthisthink:Howjavamanagethereferenceinmyprogram?WhycanI......
  • 戴尔MD3200 存储SAS SAN多路径 VS openEuler 22.03 LTS SP2
    确保系统已经安装好多路径软件;以及设定为开机自启动。编辑简版配置文件;/etc/multipath.confdefaults{user_friendly_namesyesfind_multipathsyes}blacklist{#屏蔽本地除了系统之外的硬盘wwid36b82a720cf15c5001b31a48d05dac974}multipaths{multipath{wwi......
  • Rust 开发的高性能 Python 包管理工具,可替换 pip、pip-tools 和 virtualenv
    最近,我在Python潮流周刊中分享了一个超级火爆的项目,这还不到一个月,它在Github上已经拿下了8Kstar的亮眼成绩,可见其受欢迎程度极高!国内还未见有更多消息,我趁着周末把一篇官方博客翻译出来了,分享给大家。作者:@charliermarsh译者:豌豆花下猫@Python猫英文:uv:Pythonpackag......
  • cmd--net命令
    学校里刚学到net命令,当时课上主要讲的是net的账户管理功能,但之前也碰到过使用net命令来开启mysql这样的网络服务,所以觉得总结一下net命令还是很有必要的!用户管理提权用户:netlocalgroupadministrators用户名/add创建隐藏用户:netuser用户名$网络服务启动netstartmysql......
  • (23)lazarus memdataset的filter问题
    参考https://www.cnblogs.com/qiufeng2014/p/17388138.html链接:https://pan.baidu.com/s/1ayzgDbXjgXBnw-jM1FR4gA提取码:ogqzunitUnit1;{$modeobjfpc}{$H+}interfaceusesClasses,SysUtils,memds,db,Forms,Controls,Graphics,Dialogs,DBGrids;type{TForm1......
  • 神舟数据库日常维护
    1.查看所有配置SQL>showall; 2.查看具体某个参数SQL>showmax_connections;name|setting--------------------------+---------MAX_CONNECTIONS|200MAX_CONNECTIONS_PER_USER|0SQL>showNAME_CASE_SENSITIVE;name......
  • JavaScript逆向之md5算法
    md5算法md5算法简介:md5算法是一种摘要算法,主要用来进行数字签名、文档一致性验证等。python实现md5点击查看代码fromhashlibimportmd5s="123456"obj=md5()#把你要计算的字节丢进去obj.update(s.encode("utf-8"))md5_value=obj.hexdigest()print(md5_value......
  • Rust 登上了开源头条「GitHub 热点速览」
    抱歉!上周因为出月刊工作量比较大,所以「GitHub热点速递」暂停了一期,必须要给守着更新的读者道个歉,以后每周二的「热点速递」会按时更新,下不为例......