使用 Rust Wasm 开发小米 12S Utra 莱卡水印生成工具

简介: 前言最近看到小米 12S Utra 的发布,看了下详情页面,发现演示的照片都好看的,包含了品牌、设备、镜头、位置等信息,如下图所示:

前言

最近看到小米 12S Utra 的发布,看了下详情页面,发现演示的照片都好看的,包含了品牌、设备、镜头、位置等信息,如下图所示:

image.png

作为一个摄影爱好者,也希望把自己的照片也输出这些信息。


但目前此类水印好像只在小米 12S Utra 的编辑器里有,没有其他途径。


于是就写了这个小工具。


水印工具

image.png

支持:


  • 自动读取照片 exif 数据,并自动填写到图片中,包括型号、品牌、焦距、光圈、快门、ISO、拍摄时间、GPS 信息。
  • 可手动编辑水印参数。
  • 目前支持 苹果、佳能、大疆、富士、华为、莱卡、小米、尼康、索尼 品牌。

实现

实现上比较容易,就是读取照片数据的前 4KB 数据,获取照片的基本信息,也就是 Exif 数据。


最近刚好在用 Rust,于就是就 Rust 写了 WebAssembly 进行 Exif 数据的读取,代码如下:

#[wasm_bindgen]pubfnget_exif(raw: Vec<u8>) ->JsValue {
let mutexif_data: Vec<ExifData>=Vec::new();
letexifreader=exif::Reader::new();
let mutbufreader=std::io::Cursor::new(raw.as_slice());
letexif=exifreader.read_from_container(&mutbufreader).unwrap();
forfieldinexif.fields() {
ifletSome(_) =field.tag.to_string().find("Tag(Exif") {
continue;
        }
if ["Make", "Model"].contains(&field.tag.to_string().as_str()) {
exif_data.push(ExifData {
tag: field.tag.to_string(),
value: field                    .display_value()
                    .to_string()
                    .replace(
                        |item: char| ["\"", ","].contains(&item.to_string().as_str()),
"",
                    )
                    .trim()
                    .to_string(),
value_with_unit: field                    .display_value()
                    .with_unit(&exif)
                    .to_string()
                    .replace('"', ""),
            });
continue;
        }
exif_data.push(ExifData {
tag: field.tag.to_string(),
value: field.display_value().to_string(),
value_with_unit: field.display_value().with_unit(&exif).to_string(),
        });
    }
JsValue::from_serde(&exif_data).unwrap()
}

测试了一下用 Rust Exif 与 npm exif 的执行速度:


  • Rust WebAssembly:0.6ms
  • Npm exif 包:5.6ms
  • 大约快 10倍左右,还是很夸张的。

其它示例

最后看下,使用这个工具生成的照片吧。

5e656af3-5480-4e43-8a95-d07e2123f644.png

image.png

目录
相关文章
|
7月前
|
Rust 数据可视化 安全
Rust性能分析工具概览:perf、flamegraph 与其他
Rust作为一种高性能、内存安全的编程语言,在构建大型系统和微服务时备受青睐。然而,优化Rust程序的性能需要有效的工具。本文将对Rust中常用的性能分析工具进行介绍,包括perf、flamegraph等,并探讨它们如何帮助开发者定位和解决性能瓶颈。
|
7月前
|
Rust Linux iOS开发
【一起学Rust | 开源项目】效率提升工具espanso——在日常输入中使用代码提示
【一起学Rust | 开源项目】效率提升工具espanso——在日常输入中使用代码提示
125 0
|
2月前
|
Rust 资源调度 安全
为什么使用 Rust over C++ 进行 IoT 解决方案开发
为什么使用 Rust over C++ 进行 IoT 解决方案开发
77 7
|
4月前
|
Rust 安全 JavaScript
探索Rust在系统编程领域的前景:虚拟机和编译器开发的新篇章
【8月更文挑战第31天】在系统编程领域,性能与安全性至关重要。Rust作为一种新兴语言,凭借其独特的内存安全和并发特性,正逐渐成为虚拟机和编译器开发的首选。本文通过案例分析,探讨Rust在这些领域的应用,例如Facebook的Compiler VM (CVM)项目和实验性的JavaScript JIT编译器Mithril。Rust的静态类型系统和所有权模型确保了高性能和安全性,而其强大的包管理和库生态则简化了虚拟机的开发。随着Rust社区的不断成熟,预计未来将有更多基于Rust的创新项目涌现,推动系统编程的发展。对于追求高性能和安全性的开发者而言,掌握Rust将成为一个重要战略方向。
85 1
|
5月前
|
Rust 测试技术 编译器
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
|
5月前
|
Rust 程序员 开发者
使用 Rust 开发一款类似于 GitBook 的程序
**Rust新手开发者分享开源项目 Typikon**:模仿MDBook,致力于简单Markdown到在线书的渲染。[GitHub](https://github.com/auula/typikon)上可找到源码,欢迎初学者一同学习与贡献。体验轻松构建静态网站,探索Rust之旅。🌟 加入讨论,共建更易用的GitBook替代品。在线文档见[https://typikonbook.github.io](https://typikonbook.github.io)。
41 1
|
6月前
|
Rust Unix Windows
使用Cargo国内镜像提升Rust开发效率
使用Cargo国内镜像提升Rust开发效率
546 0
|
7月前
|
Rust 监控 安全
【专栏】`ripgrep`(rg)是Linux下快速、内存高效的文本搜索工具,用Rust编写,支持PCRE2正则表达式
【4月更文挑战第28天】`ripgrep`(rg)是Linux下快速、内存高效的文本搜索工具,用Rust编写,支持PCRE2正则表达式。相比`grep`,它在处理大文件和复杂模式时更具优势。安装`rg`可通过软件包管理器,如在Debian系系统中使用`sudo apt install ripgrep`。基本用法包括简单搜索、递归搜索、忽略大小写、显示行号等。高级功能包括固定字符串搜索、多文件匹配、并行搜索、排除选项和区域搜索。适用于日志分析、代码审查等场景,是提升工作效率的利器。
578 4
|
7月前
|
Rust 监控 网络协议
运用Rust编写高效的远程监控多台电脑屏幕工具
使用Rust编程语言开发远程监控多台电脑屏幕的工具,通过安装客户端实时传输屏幕截图至监控端。示例代码展示如何利用Rust的网络编程和图像处理库捕获、发送及接收屏幕截图。监控端接收到数据后可进行保存或上传等处理,实现高效可靠的远程监控解决方案。
218 2
|
7月前
|
Rust 安全 程序员
拜登:“一切非 Rust 项目均为非法”,开发界要大变天?
白宫国家网络总监办公室(ONCD,以下简称网总办)在本周一发布的报告中说道:“程序员编写代码并非没有后果,他们的⼯作⽅式于国家利益而言至关重要。”
138 1