1. 程式人生 > >在.net(C#)中隨機生成較深的顏色

在.net(C#)中隨機生成較深的顏色

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

僅講思路,想要原始碼的請繞道。

 

一、樣式

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等軟體無法識別。

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述