feat: Logo 嵌入 — QR 码中央叠加自定义图片
- PNG 渲染:RgbaImage 上使用 imageops::overlay 叠加 logo - SVG 渲染:base64 编码 logo 嵌入 <image> 标签 - QrCode::to_png_bytes / to_svg 新增 Option<logo_bytes> 参数 - Logo 默认占 QR 区域 25%,建议配合 H 级纠错使用
This commit is contained in:
@@ -193,7 +193,7 @@ fn test_format_info_written() {
|
||||
#[test]
|
||||
fn test_svg_valid_structure() {
|
||||
let qr = QrCode::encode("HELLO", QrConfig::default()).unwrap();
|
||||
let svg = qr.to_svg();
|
||||
let svg = qr.to_svg(None);
|
||||
// SVG 应有正确的结构
|
||||
assert!(svg.starts_with("<svg"), "SVG 应以 <svg 开头");
|
||||
assert!(svg.contains("rect"), "SVG 应包含 rect 元素");
|
||||
@@ -313,7 +313,7 @@ fn test_empty_input_fails() {
|
||||
#[test]
|
||||
fn test_svg_output() {
|
||||
let qr = QrCode::encode("TEST", QrConfig::default()).unwrap();
|
||||
let svg = qr.to_svg();
|
||||
let svg = qr.to_svg(None);
|
||||
assert!(svg.contains("<svg"));
|
||||
assert!(svg.contains("</svg>"));
|
||||
assert!(svg.contains("fill=\"black\""));
|
||||
@@ -332,7 +332,7 @@ fn test_ascii_output() {
|
||||
#[test]
|
||||
fn test_png_output() {
|
||||
let qr = QrCode::encode("TEST", QrConfig::default()).unwrap();
|
||||
let png = qr.to_png_bytes(4).unwrap();
|
||||
let png = qr.to_png_bytes(4, None).unwrap();
|
||||
assert!(!png.is_empty());
|
||||
// PNG 文件应以 8 字节魔术签名开头
|
||||
assert_eq!(&png[..8], &[137, 80, 78, 71, 13, 10, 26, 10]);
|
||||
@@ -356,7 +356,7 @@ fn test_margin_is_included_in_dimensions() {
|
||||
let qr = QrCode::encode("MARGIN TEST", config).unwrap();
|
||||
|
||||
// SVG 的总宽度应该包含 margin
|
||||
let svg = qr.to_svg();
|
||||
let svg = qr.to_svg(None);
|
||||
let matrix_size = qr.size() as u32;
|
||||
let expected_total = matrix_size + 2 * 2u32;
|
||||
assert!(svg.contains(&format!("width=\"{}\"", expected_total)));
|
||||
|
||||
Reference in New Issue
Block a user