Normal view

There are new articles available, click to refresh the page.
Before yesterdayMain stream

EZCut – 简单的图片处理工具

By: Kaiyuan
16 April 2026 at 01:15

EZCut在2014到2016年期间,我在 MacOS 上用这一个简单的图片处理软件。我经常用来调整图片的尺寸,然后还有裁剪水印之类的功能,后来系统升级后作者也没更新,之后就再也找不到类似的软件了。

现在有 Vibe Coding,我决定自己动手做一个!开始用 Codex,后续也使用 Antigracity 组合开发,直接用 HTML 做软件 UI,框架使用 Tauri 可以尽可能降低软件大小同时多系统支持。因为我 2012 年的 Macbook Pro 还在用,所以软件最早支持 Mac OS 10.15。至于 Windows,Webview 已经不支持 Windows 7 所以需要 Windows 10 以上。

代码托管在 Github。项目页面:https://boxks.com/ezcut/

基本功能

EZCut UI软件 UI 基本上就直接采用我以前用的软件类似的布局,左边是图片预览和列表,右边是操作菜单。功能有:修改尺寸、裁剪、文字水印、图片覆盖(图片水印)四个功能,导出的文件名支持按规则命名,导出格式支持多种常规图片格式。

基本的修改尺寸、裁剪、保存就不用多说,水印和文件命名需要稍微说一下。

文字水印和图片覆盖都支持同时使用多个。也就是你能设置多个文字或者图片覆盖,这个功能其实差不多是用来做图片注释,直接按添加就能添加多个水印。

文件名输出说明

输出文件命名默认是格式是源文件名_当前时间.后缀名,这样可以确保每次导出都是独立的文件名,同样支持正则和多种变量。

占位符规则

  • {name}:原文件名(若启用正则,指代正则处理后的名字)
  • {index}:序列号(由下方“起始序号”和“步进”控制)
  • {timestamp}:当前时间戳 (YYYYMMDD_HHMMSS)
  • {width} / {height}:原图的分辨率宽高
  • {ext}:目标文件的扩展名

正则命名

  • ^ / $:匹配开头/结尾
  • (.*):捕获组。在“替换”栏中使用 $1$2 引用这些部分。

标志 (Flags)

  • g:全局匹配
  • i:忽略大小写
  • m:多行模式
  • s:允许 . 匹配所有字符(包括换行)

序号序列

  • 起始序号:首张图片的开始数字。
  • 步进:后续每张图片序号递加的数值。

做这个软件的原因

如果单纯说图片转换和处理,XnConvert 更强大,但 XnConvert 因为太强大所以不够快,我想要的是启动软件,拖动图片进去,简单调整参数,然后导出。最重要是快。我能想到的只是当前用的软件,之后就没怎么找到其他软件能满足我的需要。


推荐一款我写的动态配置语言: Faml

By: fawdlstty
10 November 2025 at 00:02
fawdlstty:

GitHub 仓库地址:https://github.com/fawdlstty/faml

什么是 FAML ?

FAML 是一种扩展自 TOML 的动态配置语言,专为需要运行时配置计算和更新的场景设计。它保留了 TOML 的简洁语法,同时增加了动态表达式、条件配置和运行时可变性等高级特性。

核心特性对比

特性 TOML KCL PKL FAML
语法风格 TOML 风格 JSON 风格 结构体风格 TOML 风格
动态表达式
条件配置
运行时修改
特殊数据类型

快速示例

基本语法

[server]
port = 8080
host = "localhost"

动态表达式

[database]
host = "localhost"
port = 5432
connection_string = $"postgresql://{host}:{port}/mydb"

条件配置

[app]
env = "production"

@if env == "development"
log_level = "debug"

@if env == "production"
log_level = "error"

特殊数据类型

[cache]
ttl = 5 minutes
max_size = 100 MB

[network]
timeout = 30 seconds
buffer_size = 4 KB

复杂表达式

[user]
age = 25
is_adult = age >= 18
welcome_message = is_adult ? $"Welcome, adult user!" : $"Welcome, young user!"

运行时动态修改

let mut config = FamlExpr::from_str(config_str)?;
config["server"]["port"].set_int(9000);  // 动态修改端口
let connection_string = config["database"]["connection_string"].evaluate()?.as_str();  // 自动更新连接字符串
❌
❌