二维码美化器应用


欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图

image-20260409192254814

image-20260409192300871

image-20260409192305680

image-20260409192310074

image-20260409192314997

1.1 应用简介

二维码美化器是一款创意工具应用,将普通二维码变成艺术品。支持嵌入图片、渐变色彩、形状变换等多种美化功能,让扫码也变得时尚。应用内置多种样式风格和设计模板,支持自定义颜色、渐变效果、定位点样式、边框样式,打造独一无二的个性化二维码。

应用以清新的青色为主色调,象征科技与创新。涵盖二维码生成、设计模板、生成历史、关于信息四大模块。用户可以输入内容、选择样式、调整参数、嵌入Logo,快速生成美观的二维码。

1.2 核心功能

功能模块功能描述实现方式
样式风格6种二维码样式枚举定义
渐变效果6种渐变类型Shader绘制
颜色设置自定义主色副色颜色选择器
定位点样式5种定位点风格枚举定义
边框样式6种边框效果自定义绘制
Logo嵌入支持嵌入Logo图片位置选择

1.3 样式风格定义

序号样式名称Emoji描述
1经典方块传统方块样式
2圆角方块🔘圆润柔和风格
3圆点样式时尚圆点风格
4菱形样式🔷几何菱形风格
5爱心样式❤️浪漫爱心风格
6星形样式闪耀星形风格

1.4 渐变类型定义

序号渐变名称Emoji描述
1无渐变纯色填充
2线性渐变📏平滑过渡效果
3径向渐变🎯中心向外扩散
4扫描渐变🌀旋转扫描效果
5彩虹渐变🌈七彩绚丽效果
6日落渐变🌅温暖夕阳色调

1.5 定位点样式定义

序号样式名称Emoji描述
1方形传统方形定位点
2圆角🔲圆角方形定位点
3圆形圆形定位点
4叶形🍃叶子形状定位点
5菱形💎菱形定位点

1.6 边框样式定义

序号边框名称Emoji描述
1无边框🖼️无边框效果
2简约边框简约线条边框
3圆角边框🔘圆角矩形边框
4双边框⏹️双层线条边框
5装饰边框🎨装饰性边框
6复古边框📜复古风格边框

1.7 技术栈

技术领域技术选型版本要求
开发框架Flutter>= 3.0.0
编程语言Dart>= 2.17.0
设计规范Material Design 3-
自定义绘制CustomPainter-
渐变效果Shader-
目标平台鸿蒙OS / WebAPI 21+

1.8 项目结构

lib/
└── main_qrcode_beautifier.dart
    ├── QRCodeBeautifierApp           # 应用入口
    ├── QRStyle                       # 样式风格枚举
    ├── GradientType                  # 渐变类型枚举
    ├── EyeStyle                      # 定位点样式枚举
    ├── FrameStyle                    # 边框样式枚举
    ├── LogoPosition                  # Logo位置枚举
    ├── QRCodeDesign                  # 二维码设计模型
    ├── GeneratedQRCode               # 生成二维码模型
    ├── QRCodeBeautifierHomePage      # 主页面(底部导航)
    ├── _buildEditorPage              # 生成页面
    ├── _buildDesignsPage             # 设计页面
    ├── _buildHistoryPage             # 历史页面
    └── QRCodePreviewPainter          # 二维码预览绘制器

二、系统架构

2.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
QRCodeBeautifierHomePage

生成页

设计页

历史页

关于页

内容输入

样式选择

颜色设置

参数调整

设计模板网格

快速应用

历史列表

记录操作

功能说明

使用技巧

样式渲染器
StyleRenderer

渐变处理器
GradientProcessor

边框绘制器
FramePainter

QRCodeDesign
二维码设计

GeneratedQRCode
生成二维码

QRStyle
样式风格

GradientType
渐变类型

2.2 类图设计

has

has

has

has

references

QRCodeBeautifierApp

+Widget build()

«enumeration»

QRStyle

+String label

+String emoji

+String description

+classic()

+rounded()

+dots()

+diamond()

+heart()

+star()

«enumeration»

GradientType

+String label

+String emoji

+none()

+linear()

+radial()

+sweep()

+rainbow()

+sunset()

«enumeration»

EyeStyle

+String label

+String emoji

+square()

+rounded()

+circle()

+leaf()

+diamond()

«enumeration»

FrameStyle

+String label

+String emoji

+none()

+simple()

+rounded()

+double()

+decorative()

+vintage()

QRCodeDesign

+String id

+String name

+QRStyle style

+GradientType gradient

+Color primaryColor

+Color secondaryColor

+EyeStyle eyeStyle

+FrameStyle frameStyle

+LogoPosition logoPosition

+double cornerRadius

+DateTime createdAt

GeneratedQRCode

+String id

+String content

+QRCodeDesign design

+DateTime generatedAt

2.3 页面导航流程

生成

设计

历史

关于

应用启动

生成页

底部导航

输入内容

设计模板

生成历史

应用信息

选择样式

设置颜色

调整参数

嵌入Logo

生成二维码

保存设计?

保存到模板

导出使用

点击模板

应用到生成

2.4 二维码生成流程

预览区样式渲染生成页用户预览区样式渲染生成页用户输入二维码内容验证内容选择样式风格应用样式更新预览显示效果设置颜色渐变应用渐变更新预览点击生成渲染二维码返回生成结果

三、核心模块设计

3.1 数据模型设计

3.1.1 样式风格枚举 (QRStyle)
enum QRStyle {
  classic(label: '经典方块', emoji: '⬛', description: '传统方块样式'),
  rounded(label: '圆角方块', emoji: '🔘', description: '圆润柔和风格'),
  dots(label: '圆点样式', emoji: '⚫', description: '时尚圆点风格'),
  diamond(label: '菱形样式', emoji: '🔷', description: '几何菱形风格'),
  heart(label: '爱心样式', emoji: '❤️', description: '浪漫爱心风格'),
  star(label: '星形样式', emoji: '⭐', description: '闪耀星形风格');

  final String label;
  final String emoji;
  final String description;
}
3.1.2 渐变类型枚举 (GradientType)
enum GradientType {
  none(label: '无渐变', emoji: '⬜'),
  linear(label: '线性渐变', emoji: '📏'),
  radial(label: '径向渐变', emoji: '🎯'),
  sweep(label: '扫描渐变', emoji: '🌀'),
  rainbow(label: '彩虹渐变', emoji: '🌈'),
  sunset(label: '日落渐变', emoji: '🌅');

  final String label;
  final String emoji;
}
3.1.3 二维码设计模型 (QRCodeDesign)
class QRCodeDesign {
  final String id;              // 设计ID
  final String name;            // 设计名称
  final QRStyle style;          // 样式风格
  final GradientType gradient;  // 渐变类型
  final Color primaryColor;     // 主色
  final Color secondaryColor;   // 副色
  final EyeStyle eyeStyle;      // 定位点样式
  final FrameStyle frameStyle;  // 边框样式
  final LogoPosition logoPosition; // Logo位置
  final double cornerRadius;    // 圆角大小
  final DateTime createdAt;     // 创建时间
}
3.1.4 生成二维码模型 (GeneratedQRCode)
class GeneratedQRCode {
  final String id;              // 二维码ID
  final String content;         // 二维码内容
  final QRCodeDesign design;    // 应用的设计
  final DateTime generatedAt;   // 生成时间
}
3.1.5 样式风格分布
35%25%15%10%8%7%样式风格使用分布示例圆角方块圆点样式经典方块菱形样式爱心样式星形样式

3.2 页面结构设计

3.2.1 主页面布局

QRCodeBeautifierHomePage

IndexedStack

生成页

设计页

历史页

关于页

NavigationBar

生成 Tab

设计 Tab

历史 Tab

关于 Tab

3.2.2 生成页结构

生成页

SliverAppBar

快速统计

内容输入

二维码预览

样式选择

颜色设置

定位点边框

Logo选项

操作按钮

样式预览

渐变效果

边框显示

样式卡片列表

主色选择

副色选择

渐变类型

圆角滑块

3.2.3 二维码预览结构

二维码预览

背景层

二维码模块层

定位点层

边框层

Logo层

信息标签层

白色背景

样式模块绘制

渐变填充

边框样式绘制

Logo位置绘制

样式标签

3.2.4 设计页结构

设计页

SliverAppBar

设计模板网格

设计卡片

渐变背景

样式图标

设计名称

参数摘要

3.3 样式绘制逻辑

经典方块

圆角方块

圆点样式

菱形样式

爱心样式

星形样式

获取样式类型

样式类型

绘制矩形

绘制圆角矩形

绘制圆形

绘制菱形路径

绘制贝塞尔曲线

绘制多角星形

应用渐变填充

完成模块绘制

3.4 渐变处理逻辑

无渐变

线性渐变

径向渐变

扫描渐变

彩虹渐变

日落渐变

获取渐变类型

渐变类型

纯色填充

创建LinearGradient

创建RadialGradient

创建SweepGradient

创建彩虹渐变

创建日落渐变

应用到Paint

绘制二维码模块


四、UI设计规范

4.1 配色方案

应用以清新的青色为主色调,象征科技与创新:

颜色类型色值用途
主色#00BCD4 (Cyan)导航、主题元素
辅助色#26C6DA设计页面
第三色#4DD0E1历史页面
强调色#80DEEA关于页面
背景色#FAFAFA页面背景
卡片背景#FFFFFF设计卡片

4.2 渐变色方案

渐变名称颜色组合视觉效果
科技蓝#2196F3 → #00BCD4清新科技
浪漫粉#E91E63 → #FF4081浪漫温馨
彩虹风七彩渐变绚丽多彩
日落橙#FF512F → #F09819温暖夕阳

4.3 字体规范

元素字号字重颜色
页面标题24pxBold主色
设计名称16pxBold#000000
样式标签12pxRegular白色
参数数值12pxRegular灰色
统计数字20pxBold白色

4.4 组件规范

4.4.1 内容输入框
┌─────────────────────────────────────┐
│  二维码内容                          │
│  ┌─────────────────────────────┐   │
│  │ https://example.com      ✕  │   │
│  │                             │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘
4.4.2 样式选择卡片
┌─────────────────────────────────────┐
│  二维码样式                          │
│                                     │
│  ┌──────┐ ┌──────┐ ┌──────┐        │
│  │  ⬛  │ │  🔘  │ │  ⚫  │        │
│  │经典  │ │圆角  │ │圆点  │        │
│  │方块  │ │方块  │ │样式  │        │
│  └──────┘ └──────┘ └──────┘        │
└─────────────────────────────────────┘
4.4.3 颜色设置区域
┌─────────────────────────────────────┐
│  颜色设置                            │
│                                     │
│  主色        副色        渐变类型    │
│  ┌────┐    ┌────┐    ┌────────┐   │
│  │    │    │    │    │📏 线性▼│   │
│  └────┘    └────┘    └────────┘   │
│                                     │
│  圆角大小  ────────●────────  4.0   │
└─────────────────────────────────────┘
4.4.4 二维码预览区域
┌─────────────────────────────────────┐
│  ┌─────────────────────────────┐   │
│  │  ⬛⬛⬛⬛⬛    ⬛⬛⬛⬛⬛  │   │
│  │  ⬛    ⬛    ⬛    ⬛        │   │
│  │  ⬛ ⬛ ⬛    ⬛ ⬛ ⬛        │   │
│  │  ⬛    ⬛    ⬛    ⬛        │   │
│  │  ⬛⬛⬛⬛⬛    ⬛⬛⬛⬛⬛  🔘圆角│
│  │              ┌─────┐        │   │
│  │              │LOGO │        │   │
│  │              └─────┘        │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘
4.4.5 Logo选项区域
┌─────────────────────────────────────┐
│  嵌入Logo                    [开关] │
│                                     │
│  Logo位置                           │
│  [🎯] [↖️] [↗️] [↙️] [↘️]          │
└─────────────────────────────────────┘

五、核心功能实现

5.1 样式绘制实现

void _drawModule(Canvas canvas, double x, double y, double size, Paint paint, int row, int col) {
  final rect = Rect.fromLTWH(x, y, size, size);
  final rrect = RRect.fromRectAndRadius(rect, Radius.circular(cornerRadius));

  switch (style) {
    case QRStyle.classic:
      canvas.drawRect(rect, paint);
      break;
    case QRStyle.rounded:
      canvas.drawRRect(rrect, paint);
      break;
    case QRStyle.dots:
      canvas.drawCircle(Offset(x + size / 2, y + size / 2), size / 2, paint);
      break;
    case QRStyle.diamond:
      final path = Path()
        ..moveTo(x + size / 2, y)
        ..lineTo(x + size, y + size / 2)
        ..lineTo(x + size / 2, y + size)
        ..lineTo(x, y + size / 2)
        ..close();
      canvas.drawPath(path, paint);
      break;
    case QRStyle.heart:
      _drawHeart(canvas, x, y, size, paint);
      break;
    case QRStyle.star:
      _drawStar(canvas, x, y, size, paint);
      break;
  }
}

5.2 渐变创建实现

Shader _createGradient(Rect rect) {
  switch (gradient) {
    case GradientType.none:
      return LinearGradient(colors: [primaryColor, primaryColor]).createShader(rect);
    case GradientType.linear:
      return LinearGradient(
        colors: [primaryColor, secondaryColor],
        begin: Alignment.topLeft,
        end: Alignment.bottomRight,
      ).createShader(rect);
    case GradientType.radial:
      return RadialGradient(
        colors: [primaryColor, secondaryColor],
      ).createShader(rect);
    case GradientType.sweep:
      return SweepGradient(
        colors: [primaryColor, secondaryColor, primaryColor],
      ).createShader(rect);
    case GradientType.rainbow:
      return LinearGradient(
        colors: [
          const Color(0xFFFF0000),
          const Color(0xFFFF7F00),
          const Color(0xFFFFFF00),
          const Color(0xFF00FF00),
          const Color(0xFF0000FF),
          const Color(0xFF4B0082),
          const Color(0xFF9400D3),
        ],
      ).createShader(rect);
    case GradientType.sunset:
      return LinearGradient(
        colors: [const Color(0xFFFF512F), const Color(0xFFF09819)],
        begin: Alignment.topCenter,
        end: Alignment.bottomCenter,
      ).createShader(rect);
  }
}

5.3 爱心绘制实现

void _drawHeart(Canvas canvas, double x, double y, double size, Paint paint) {
  final path = Path();
  final center = Offset(x + size / 2, y + size / 2);
  final scale = size / 30;

  path.moveTo(center.dx, center.dy + 8 * scale);
  path.cubicTo(
    center.dx - 10 * scale, center.dy - 5 * scale,
    center.dx - 10 * scale, center.dy - 15 * scale,
    center.dx, center.dy - 8 * scale,
  );
  path.cubicTo(
    center.dx + 10 * scale, center.dy - 15 * scale,
    center.dx + 10 * scale, center.dy - 5 * scale,
    center.dx, center.dy + 8 * scale,
  );

  canvas.drawPath(path, paint);
}

5.4 星形绘制实现

void _drawStar(Canvas canvas, double x, double y, double size, Paint paint) {
  final path = Path();
  final center = Offset(x + size / 2, y + size / 2);
  final outerRadius = size / 2;
  final innerRadius = size / 4;

  for (int i = 0; i < 10; i++) {
    final radius = i.isEven ? outerRadius : innerRadius;
    final angle = (i * 36 - 90) * 3.14159 / 180;
    final px = center.dx + radius * cos(angle);
    final py = center.dy + radius * sin(angle);

    if (i == 0) {
      path.moveTo(px, py);
    } else {
      path.lineTo(px, py);
    }
  }
  path.close();

  canvas.drawPath(path, paint);
}

5.5 二维码生成实现

void _generateQRCode() {
  if (_contentController.text.isEmpty) {
    ScaffoldMessenger.of(context).showSnackBar(
      const SnackBar(
        content: Text('请输入二维码内容'),
        backgroundColor: Colors.orange,
      ),
    );
    return;
  }

  setState(() {
    _isGenerating = true;
  });

  Future.delayed(const Duration(seconds: 2), () {
    final design = QRCodeDesign(
      id: 'design_${DateTime.now().millisecondsSinceEpoch}',
      name: '自定义设计 ${_savedDesigns.length + 1}',
      style: _selectedStyle,
      gradient: _selectedGradient,
      primaryColor: _primaryColor,
      secondaryColor: _secondaryColor,
      eyeStyle: _selectedEyeStyle,
      frameStyle: _selectedFrameStyle,
      logoPosition: _selectedLogoPosition,
      cornerRadius: _cornerRadius,
    );

    final qrCode = GeneratedQRCode(
      id: 'qr_${DateTime.now().millisecondsSinceEpoch}',
      content: _contentController.text,
      design: design,
    );

    setState(() {
      _history.insert(0, qrCode);
      _isGenerating = false;
    });
  });
}

六、交互设计

6.1 生成流程

渲染器预览区生成页用户渲染器预览区生成页用户输入二维码内容验证内容选择样式风格应用样式更新预览显示效果设置颜色渐变应用渐变实时更新点击生成渲染二维码返回生成结果

6.2 设计应用流程

点击模板

保存设计

打开设计页

显示模板网格

用户操作

应用设计设置

跳转生成页

显示效果

保存当前设置

添加到模板

6.3 历史管理流程

点击记录

点击应用

生成完成

历史列表

查看详情

应用设计

生成页


七、扩展功能规划

7.1 后续版本规划

2024-01-072024-01-142024-01-212024-01-282024-02-042024-02-112024-02-182024-02-252024-03-032024-03-102024-03-172024-03-242024-03-31基础UI框架 样式风格实现 渐变效果实现 真实二维码生成 更多样式风格 批量生成功能 动态二维码 社交分享 云端存储 V1.0 基础版本V1.1 增强版本V1.2 进阶版本二维码美化器应用开发计划

7.2 功能扩展建议

7.2.1 真实二维码生成

生成功能:

  • 集成二维码生成库
  • 支持多种编码格式
  • 错误纠正级别设置
  • 高分辨率导出
7.2.2 动态二维码

动态功能:

  • GIF动画效果
  • 渐变动画
  • 粒子效果
  • 交互式二维码
7.2.3 社交分享

分享功能:

  • 一键分享到社交平台
  • 批量导出
  • 水印添加
  • 云端备份

八、注意事项

8.1 开发注意事项

  1. 可识别性:美化后的二维码必须保证可被扫描识别

  2. 对比度:颜色搭配需保证足够的对比度

  3. Logo大小:嵌入Logo不能遮挡过多二维码区域

  4. 性能优化:复杂样式需优化绘制性能

  5. 导出质量:导出图片需保证足够分辨率

8.2 常见问题

问题原因解决方案
无法扫描对比度不足调整颜色对比度
Logo遮挡过多Logo尺寸过大减小Logo尺寸
渐变效果异常渐变范围错误检查Shader设置
样式显示异常绘制参数错误检查路径计算
导出模糊分辨率不足提高导出分辨率

8.3 使用技巧

📱 二维码美化技巧 📱

样式选择建议

  • 圆角方块:适合商务场景,专业大气
  • 圆点样式:适合时尚品牌,潮流前卫
  • 爱心样式:适合浪漫主题,温馨甜蜜
  • 星形样式:适合娱乐活动,闪耀夺目

颜色搭配建议

  • 科技蓝渐变:适合科技产品
  • 浪漫粉渐变:适合女性品牌
  • 彩虹渐变:适合创意活动
  • 日落渐变:适合温暖主题

Logo嵌入技巧

  • Logo不宜过大,建议不超过二维码面积的15%
  • Logo周围留白,避免遮挡关键信息
  • 选择与二维码风格协调的Logo

九、运行说明

9.1 环境要求

环境版本要求
Flutter SDK>= 3.0.0
Dart SDK>= 2.17.0
鸿蒙OSAPI 21+
Web浏览器Chrome 90+

9.2 运行命令

# 查看可用设备
flutter devices

# 运行到Web服务器
flutter run -d web-server -t lib/main_qrcode_beautifier.dart --web-port 8140

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_qrcode_beautifier.dart

# 代码分析
flutter analyze lib/main_qrcode_beautifier.dart

十、总结

二维码美化器应用通过二维码生成、设计模板、生成历史、关于信息四大模块,为用户提供了一个便捷的二维码美化平台。应用支持6种样式风格、6种渐变效果、5种定位点样式、6种边框样式,让用户轻松打造独一无二的个性化二维码。

核心功能涵盖样式选择、颜色设置、渐变效果、Logo嵌入四大模块。样式风格从经典方块到星形样式,满足不同场景需求;渐变效果支持线性、径向、扫描、彩虹、日落等多种类型;颜色设置支持自定义主色副色和圆角调节;Logo嵌入支持5种位置选择。

应用采用 Material Design 3 设计规范,以清新的青色为主色调,象征科技与创新。通过本应用,希望能够帮助用户将普通二维码变成艺术品,让扫码也变得时尚。

二维码美化器——把二维码变成艺术品


欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐