原文: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. POI操作Excel常用方法总结 分类: B1_JAVA 2013-08-23 10:01 349人阅读 评论(0) 收藏

    转载自:http://blog.csdn.net/xjun15/article/details/5805429     一. POI简介               Apache POI是Apache ...

  2. js进阶 11-19 jquery如何查找选择器的第一个父亲元素和第一个定位的父元素

    js进阶 11-19 jquery如何查找选择器的第一个父亲元素和第一个定位的父元素 一.总结 一句话总结:closest()方法获得匹配选择器的第一个祖先元素,从当前元素开始沿 DOM 树向上.of ...

  3. Jupyter Notebook 常用快捷键

    Jupyter Notebook 提供了比 IPython 美观的多得多的可视化形式.(比如对于 pandas 下的 DataFrame 的展示,df.head(5)) Jupyter Noteboo ...

  4. 【codeforces 742C】Arpa's loud Owf and Mehrdad's evil plan

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

  5. Android bitmap绘制文字自动换行

    public Bitmap getNewBitMap(String text) { Bitmap newBitmap = Bitmap.createBitmap(,, Config.ARGB_4444 ...

  6. 微信测试号开发之九 微信网页授权:页面获取用户openid

    原文链接:https://blog.csdn.net/qq_37936542/article/details/78981369 一:配置接口 注意:这里填写的是域名(是一个字符串),而不是URL,因此 ...

  7. 【codeforces 758C】Unfair Poll

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

  8. iOS常用加密方法(aes、md5、base64)

    1.代码 iOS常用加密方法(aes.md5.base64) .AES加密 NSData+AES.h文件 // // NSData-AES.h // Smile // // Created by 周 ...

  9. iOS QLPreviewController(Quick Look)快速浏览jpg,PDF,world等

    #import <QuickLook/QuickLook.h> @interface ViewController ()<QLPreviewControllerDataSource, ...

  10. android studio 各种问题 应该能帮助到你们

    1. you can import your settings from a previous version of Studio 可以导入您的设置从先前版本的工作室 2. I want to imp ...