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等软件无法识别。
C#彩色艺术化二维码样式设计(仅说思路)的更多相关文章
- 通通WPF随笔(3)——艺术二维码素材生成器
原文:通通WPF随笔(3)--艺术二维码素材生成器 最近公司让我开发一个条形码的生成控件,花了半天时间搞定觉得不过瘾,什么年代了该用二维码了吧.于是wiki了一下二维码的资料. 比较常见的就是QR码( ...
- Java生成艺术二维码也可以很简单
原文点击: Quick-Media Java生成艺术二维码也可以很简单 现在二维码可以说非常常见了,当然我们见得多的一般是白底黑块,有的再中间加一个 logo,或者将二维码嵌在一张特定的背景中(比如微 ...
- 分享:Java 开发精美艺术二维码
博客地址:https://ainyi.com/58 Java 开发精美艺术二维码 看到网络上各种各样的二维码层出不穷,好像很炫酷的样子,一时兴起,我也要制作这种炫酷二维码效果 例如: 根据以往例子 根 ...
- Altium PCB二维码Logo设计(转 crazybingo)
Altium PCB二维码Logo设计 每次设计PCB的时候,都会在空白部分放Logo上去,一来板卡显得更充实,二来更有成就感一些... 今天突然想着...这两年二维码越来越火,火到快爆发,不如在板卡 ...
- 二维码彩色广告招牌的切割制作问题(C#.net下对彩色二维码圆角样式及改进)
原文:二维码彩色广告招牌的切割制作问题(C#.net下对彩色二维码圆角样式及改进) 我们知道,目前二维码还很少用于广告招牌的制作.但随着智能手机越来越普及,互联网等网络的应用也越来越广泛,作为连接物理 ...
- 二维码名片的格式 - vcard(非常好,可直接添加到手机通讯录)
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 登录|注册 ...
- 巧用 CSS 构建渐变彩色二维码
今日,群里有个很有意思的问题,问我如何实现一个彩色的,带渐变的二维码,像是这样: 很有意思的问题,我们在百度谷歌,搜索 qrcode,能搜到非常多在线制作二维码的工具,它们其中一些也会带有制作渐变二维 ...
- react页面内嵌微信二维码 和 自定义样式 以及 微信网页共用unionId问题
在react页面内嵌“微信二维码”,实现PC端通过微信扫码进行登录.首先去微信开放平台注册一个账号,创建一个网站应用,提交网站备案审核,获取appid和appsecret:其他开发流程根据微信文档来进 ...
- Atitit java 二维码识别 图片识别
Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...
随机推荐
- Linux系统下的单调时间函数
欢迎转载,转载请注明出处:http://forever.blog.chinaunix.net 一.编写linux下应用程序的时候,有时候会用到高精度相对时间的概念,比如间隔100ms.那么应该使用哪个 ...
- mycat server.xml 配置文件详解
<?xml version="1.0" encoding="UTF-8"?> <!-- - - Licensed under the Apac ...
- 百度UEditor图片上传、SpringMVC、Freemarker、Tomcat、Nginx、静态资源
个人官网.公司项目都需要 可视化编辑器,百度UEditor做得很不错,就用的这个.项目后台用到了SpringMVC.Freemarker,开发过程中部署在Jetty,线上部署用Tomcat,最后可能配 ...
- swf loading 自身
stop(); import flash.net.URLRequest; import caurina.transitions.Tweener; loaderInfo.addEventListener ...
- [React Router v4] Use Regular Expressions with Routes
We can use regular expressions to more precisely define the paths to our routes in React Router v4. ...
- 一种基于uCos-II操作系统和lwIP协议栈的IEEE-1588主站以及基于该主站的报文处理方法
主站以及应用于电力系统的支持IEEE‐1588协议的主时钟(IEEE‐1588主站)的实现方法.该方法是在一个低成本的硬件平台上,借助uCos‐II操作系统和TCP/IP的协议栈,对以太网数据进行了分 ...
- Python采用struct处理二进制
有时需要使用python二进制数据,实例,件.socket操作时.这时候.能够使用python的struct模块来完毕.能够用 struct来处理c语言中的结构体. struct模块中最重要的三个函数 ...
- Linux下的正斜杠"/"和"\"的区别
今天在检查root目录时发现有一个名为"\"的文件,觉得很奇怪,从来没见过,就准备用Vim打开看看,很自然地输入命令查看一下,结果居然打不开. [root@localhost ~] ...
- tomcat添加跨域访问功能-Access-Control-Allow-Origin:*
目标:tomcat服务器提供的接口,不能在其他域中访问的时候,需要增 Access-Control-Allow-Origin:* 直接配置的方法很多,但是我一个没有成功过,所以只能自己写拦截器了. 1 ...
- Scrollbox的滚动条事件scrollbar事件的处理(Lazarus)
没办法,改源代码: 找到:Forms单元中scrollbox的父类: TScrollingWinControl = class(TCustomControl) 改: { TScrollingWi ...