C#彩色艺术化二维码样式设计(仅说思路)
仅讲思路,想要源码的请绕道。
一、样式
1、先看各种二维码的样式吧:
(1)最简单的样式——黑白样式,如下图:
图1 最平常见到的二维码样式
(如果你用智能手机,且已安装二维码扫描软件,扫描之后你会发现它就是一个网址:http://www.lgms.net)
(2)以下为在基本样式的基础上进行的改进:
图2 圆形点状样式(为了保持可识别性,三个定位方块图没有圆形点状化)。
图3 加外框的圆形点状二维码
图4 双色二维码(白底红码)
图5 数据区的每个单格格加外框
图6 数据区域加阴影
图7 多种颜色按序排列
图8 随机色加框(左) 圆点状+阴影(右)
(关于随机色的生成,见我的另一篇文章:在.net(C#)中随机生成较深的颜色 )
图9 数据区用底图纹理填充并单元格加框
图10 数据区纹理填充加阴影,整体加外框
图11 数据区使用圆形点状且用纹理图填充
2、以下为各种彩色艺术二维码的样式:
艺术图1 双色(前景为淡草绿、背景白色) + 圆角 + 附加图形
艺术图2 艺术二维码(旋转 + 纹理填充 + 附加图形)
艺术图3 圆形点状 + 纹理填充 + 附加图形
艺术图4 双色 + 艺术化排列 + 附加图形 + 文字说明
艺术图5 双色 + 附加图形 + 圆角
艺术图6 纹理底图 + 圆角 + 附加图形 + 圆形点状 + 双色
艺术图7 附加图形
艺术图8 圆角 + 附图 + 彩色渐变
艺术图9 圆角 + 附加图形 + 数据区外框
艺术图10
艺术图11
艺术图12
艺术图13
艺术图14
艺术图15
说句实在话,上述艺术图形绝大多数是通过设计软件手工制作的,但采用编程方式来实现并不容易,不容易并不代表不能实现,只是需要花费更多的时间罢了。
二、枚举
1、根据填充样式(颜色及纹理),我把它分成五种:黑白色,双色,多种有序色,随机色,纹理图填充。
以下为枚举文件的核心代码:
public enum FillType
{
/// <summary>
/// 普通样式
/// </summary>
[Description("普通样式:白底黑图")]
BlackAndWhite,
/// <summary>
/// 两种彩色
/// </summary>
[Description("前景、背景两种彩色")]
Bicolored,
/// <summary>
/// 多彩的(多种指定颜色)
/// </summary>
[Description("多种指定颜色顺序排列")]
Multicolored,
/// <summary>
/// 随机色的
/// </summary>
[Description("随机色样式")]
RandomColored,
/// <summary>
/// 纹理图填充
/// </summary>
[Description("纹理图填充)")]
Textured
}
3、根据单格形状,我把它分为三种:矩形块状,圆形点状、圆角状(拐角为圆角矩形)。
以下为C#枚举核心代码:
public enum ShapeType
{
/// <summary>
/// 矩形块状
/// </summary>
[Description("矩形块状")]
Block,
/// <summary>
/// 圆形点状
/// </summary>
[Description("圆形点状")]
Dotted,
/// <summary>
/// 圆角(仅拐角处呈圆形矩形)
/// </summary>
[Description("圆角(仅拐角处呈圆形矩形)")]
RadiusCorner
}
4、根据修饰样式,我分为七种情况,以下为枚举核心代码:
public enum DecorativeType
{
/// <summary>
/// 单元格外框
/// </summary>
[Description("单元格外框")]
CellBorder = 1,
/// <summary>
/// 数据区外框
/// </summary>
[Description("数据区外框")]
CoreDataBorder = 2,
/// <summary>
/// 整体加线框(空白区域为四倍于单元格)
/// </summary>
[Description("整体加线框(空白区域为四倍于单元格)")]
OuterBorder = 4,
/// <summary>
/// 加阴影
/// </summary>
[Description("加阴影")]
Shadowed = 8,
/// <summary>
/// 附加图形
/// </summary>
[Description("附加图形")]
AppendImages = 16,
/// <summary>
/// 位置探测图形给特定颜色(DifferentColorOfPositionDetectionPattern)
/// </summary>
[Description("位置探测图形给特定颜色")]
DifferentColorPattern = 32,
/// <summary>
/// 修饰类边框
/// </summary>
[Description("修饰类边框")]
DecorativeBorder = 64
}
三、类构造及实现(仅讲思路):
1、建一个IPainter接口,里面有一个Draw()方法。
interface IPainter
{
Bitmap Draw();
}
2、在此继承出一个IQRCodePainter接口,里面增加定义相关图形样式的公有属性。
interface IQRCodePainter : IPainter
{
FillType FillType { get; set; }
ShapeType ShapeType { get; set; }
DecorativeType DecorativeType { get; set; }
string Name { get; set; }
string Content { get; set; }
QRCodeEncoder QRCodeEncoder { get; set; }
Encoding Encoding { get; set; }
int QRCodeScale { get; set; }
}
3、接下来就是建一个CodePainter类了,由于它是具体实例的概括抽象,所以,就使用了public abstract 关键字:
public abstract class CodePainter : IQRCodePainter
{
//实现IQRCodePainter相关公共属性的代码
//以及实现相关实例所必须的公共方法
(太长,略。这里仅说思路)
//还有就是:
public abstract Bitmap Draw(); //这个由具体的实例类去Override即可。
}
4、实现实例化的类
根据填充样式,写出五个类:
BlackAndWhitePainter,
BicoloredPainter,
MulticoloredPainter,
RandomColoredPainter,
TexturedPainter
里面根据形状不同及修饰样式的不同而做不同的绘制处理。需要说明的是:FillType, ShapeType是单一关系,而DecorativeType是叠加关系,所以,前两者没有使用倍增式数字枚举值,而DecorativeType则使用了1,2,4,8……枚举值方式,以方便实现效果叠加处理。
5、测试界面的设计(用图说话):
题外话:
今天在上传相关图像时才发现,使用C# GDI+图片保存功能时,保存好的图片居然在CSDN博客图像上传时无法上传图片!报错:
* The filetype you are attempting to upload is not allowed.
但这些图片在ACDSEE及WINDOWS自带画图工具中均可以打开,但在Photoshop中却无法打开。后来将同样的图片在WINDOWS自带画图工具中打开另存为之后,发现图片文件大小倍增至原来的两倍左右!估计是GDI+中保存的图片不带相关格式的描述信息所致PS等软件无法识别。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
关于二维码分块上色(彩色二维码)的算法研究
原文: 关于二维码分块上色(彩色二维码)的算法研究 众所周知,二维码通常是黑白的,而且是由若干个长方形或正方形小块平铺而成。但从人们的审美角度来看,常见的黑白二维码不免让人审美疲劳。本文试着从分块上色的角度对二维码进行美化,并尝试讲一下“美化”的编程思路。 一、缘由及目的: 首先,我们来看看正常情况下的黑白二维码,如图1: 图1 普通二维码(黑白条块) 上色的难点在于如何上色,上什么色,也就是哪些块“着”什么颜色。(关于彩色二维码的效果,请参考我的另一篇文章:《C#彩色艺术化二维码样式设计(仅说思路)》http://blog.csdn.net/johnsuna/article/details/7933619) 如果上错了色,也会成为“大花脸”,变得并不艺术。就好像漂亮的农村姑娘,如果穿上大花衣裳,看上去鲜艳,但仍然显示不出其天生的丽质,反而显得“很土”。如下图2及图3: 图2 大花脸式的彩色二维码 图3 单块随机色(彩色)二维码 而上色的难点在于分块,也就是将二维码分成多少块、如何分块,相关色块上什么颜色,后一个问题是美术工程师考虑的,不在本文讨论范围之内。从图1,图2来看,分块的归...
- 下一篇
WPF中TextBlock文本换行与行间距
原文: WPF中TextBlock文本换行与行间距 换行符: C#代码中:\r\n 或 \r 或 \n XAML中:
 或 
 注:\r 回车 (carriage return 缩写),\n 新行 (new line 缩写)。 行间距: LineHeight属性 示例: <TextBlock LineHeight="20" Text=" I'm line1 
 I'm line 2"/> <TextBlock LineHeight="20" Text=" I'm line1 
 I'm line 2"/> \r与\n的区别: \r :到当前行的最左边。 \n:向下移动一行,并不移动左右。 Linux中:\n表示回车+换行; Windows中:\r\n表示回车+换行。 Mac中:\r表示回车+换行。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- 2048小游戏-低调大师作品
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)