feat: 格式扩展 — 支持 BMP/JPEG/WebP 输出

- png.rs 重命名为 image.rs,新增 OutputFormat 枚举
- QrCode::to_image_bytes 支持 PNG/BMP/JPEG/WebP
- CLI 新增 -f/--format 参数(png/bmp/jpeg/webp)
- Web API fmt 参数扩展至全部 4 种图像格式
- core/Cargo.toml: image crate 新增 bmp feature
This commit is contained in:
2026-06-19 21:34:21 +08:00
parent ef6b092eda
commit b41f6ee7df
6 changed files with 115 additions and 41 deletions
+20 -13
View File
@@ -55,6 +55,10 @@ struct Args {
#[arg(long)]
logo: Option<String>,
/// 输出图像格式 [png/bmp/jpeg/webp] [default: png]
#[arg(short = 'f', long, default_value = "png")]
format: String,
// ---- 编码模式参数 ----
/// 编码模式 [text/url/wifi/vcard/email/phone/sms/batch]
#[arg(long)]
@@ -199,24 +203,27 @@ fn main() -> anyhow::Result<()> {
.to_lowercase();
match ext.as_str() {
"png" => {
let bytes = qr.to_png_bytes(args.size, logo_bytes.as_deref())?;
fs::write(path, bytes)?;
println!(
"已生成: {} (版本 {}, {}×{} 模块, {:?} 级纠错)",
path,
qr.version.0,
qr.size(),
qr.size(),
qr.level
);
}
"svg" => {
let svg = qr.to_svg(logo_bytes.as_deref());
fs::write(path, svg)?;
println!("已生成: {} (版本 {}, SVG 格式)", path, qr.version.0);
}
_ => anyhow::bail!("不支持的文件格式: .{}。支持 .png / .svg", ext),
_ => {
let fmt = qr_core::render::image::OutputFormat::from_ext(&ext)
.or_else(|| qr_core::render::image::OutputFormat::from_ext(&args.format))
.unwrap_or(qr_core::render::image::OutputFormat::Png);
let bytes = qr.to_image_bytes(args.size, logo_bytes.as_deref(), Some(fmt))?;
fs::write(path, bytes)?;
println!(
"已生成: {} (版本 {}, {}×{} 模块, {:?} 级纠错, {})",
path,
qr.version.0,
qr.size(),
qr.size(),
qr.level,
fmt.extension()
);
}
}
}
None => {