原文: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#彩色艺术化二维码样式设计(仅说思路)的更多相关文章

  1. 通通WPF随笔(3)——艺术二维码素材生成器

    原文:通通WPF随笔(3)--艺术二维码素材生成器 最近公司让我开发一个条形码的生成控件,花了半天时间搞定觉得不过瘾,什么年代了该用二维码了吧.于是wiki了一下二维码的资料. 比较常见的就是QR码( ...

  2. Java生成艺术二维码也可以很简单

    原文点击: Quick-Media Java生成艺术二维码也可以很简单 现在二维码可以说非常常见了,当然我们见得多的一般是白底黑块,有的再中间加一个 logo,或者将二维码嵌在一张特定的背景中(比如微 ...

  3. 分享:Java 开发精美艺术二维码

    博客地址:https://ainyi.com/58 Java 开发精美艺术二维码 看到网络上各种各样的二维码层出不穷,好像很炫酷的样子,一时兴起,我也要制作这种炫酷二维码效果 例如: 根据以往例子 根 ...

  4. Altium PCB二维码Logo设计(转 crazybingo)

    Altium PCB二维码Logo设计 每次设计PCB的时候,都会在空白部分放Logo上去,一来板卡显得更充实,二来更有成就感一些... 今天突然想着...这两年二维码越来越火,火到快爆发,不如在板卡 ...

  5. 二维码彩色广告招牌的切割制作问题(C#.net下对彩色二维码圆角样式及改进)

    原文:二维码彩色广告招牌的切割制作问题(C#.net下对彩色二维码圆角样式及改进) 我们知道,目前二维码还很少用于广告招牌的制作.但随着智能手机越来越普及,互联网等网络的应用也越来越广泛,作为连接物理 ...

  6. 二维码名片的格式 - vcard(非常好,可直接添加到手机通讯录)

    分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享   登录|注册     ...

  7. 巧用 CSS 构建渐变彩色二维码

    今日,群里有个很有意思的问题,问我如何实现一个彩色的,带渐变的二维码,像是这样: 很有意思的问题,我们在百度谷歌,搜索 qrcode,能搜到非常多在线制作二维码的工具,它们其中一些也会带有制作渐变二维 ...

  8. react页面内嵌微信二维码 和 自定义样式 以及 微信网页共用unionId问题

    在react页面内嵌“微信二维码”,实现PC端通过微信扫码进行登录.首先去微信开放平台注册一个账号,创建一个网站应用,提交网站备案审核,获取appid和appsecret:其他开发流程根据微信文档来进 ...

  9. Atitit java 二维码识别 图片识别

    Atitit java 二维码识别 图片识别 1.1. 解码11.2. 首先,我们先说一下二维码一共有40个尺寸.官方叫版本Version.11.3. 二维码的样例:21.4. 定位图案21.5. 数 ...

随机推荐

  1. 【26.8%】【CF 46D】Parking Lot

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  2. [Angular Unit Testing] Shallow Pipe Testing

    import { TestBed, ComponentFixture } from '@angular/core/testing'; import { BrowserDynamicTestingMod ...

  3. Windows 程序启动性能优化(先载入EXE,后载入DLL,只取有限的代码载入内存,将CPU的IP指向程序的入口点)

    一.重定位链接时重定位:目标文件一般由多个节组成,编译器在编译每个目标文件时一般都是从0地址开始生成代码.当多个代码节合成一个代码段时,需要根据其在最终代码段中的位置做出调整.同时,链接器需要对已经解 ...

  4. Android 带文字的图片分享

    这里也记录下上下文,因为做了一个失物招领的App,当有人上交了失物之后,可以将这个消息分享出去,这个消息内容有物品的信息和图片,而微信SDK始终无法做到,就想着把物品信息嵌入到图片中分享出去,先放一个 ...

  5. 【33.33%】【codeforces 552B】Vanya and Books

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. php实现 明明的随机数

    php实现 明明的随机数 一.总结 一句话总结: 1.asort是干嘛的? asort — 对数组进行排序并保持索引关系 2.从控制台取数据怎么取? trim(fgets(STDIN)) 3.多组测试 ...

  7. Java数组定义学习的一些随笔

    //一维数组的定义 int[] arr1 = new int[3];//arr1 = {1,2,3}: 错误 int[] arr2 = new int[]{1,2,3};//int[] arr2 = ...

  8. Sitecore

    Sitecore 功能最强大.最丰富的企业级 .NET 网站内容管理系统.包含的功能如下所述: 内容编辑和会话中的个性化 用于预览访客所看到的网站内容的体验浏览器 设备和地理位置 IP 检测(需要额外 ...

  9. iOS开发 - OC - block的详解 - 基础篇

    深入理解oc中的block 苹果在Mac OS X10.6 和iOS 4之后引入了block语法.这一举动对于许多OC使用者的编码风格改变很大.就我本人而言,感觉block用起来还是很爽的,但一直以来 ...

  10. URAL 1684. Jack&#39;s Last Word KMP

    题目来源:URAL 1684. Jack's Last Word 题意:输入a b 把b分成若干段 每一段都是a的前缀 思路:b为主串 然后用a匹配b 记录到b的i位置最大匹配的长度 然后切割 切割的 ...