在.net(C#)中隨機生成較深的顏色
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
僅講思路,想要原始碼的請繞道。
一、樣式
1、先看各種二維碼的樣式吧:
(1)最簡單的樣式——黑白樣式,如下圖:
圖1 最平常見到的二維碼樣式
(如果你用智慧手機,且已安裝二維碼掃描軟體,掃描之後你會發現它就是一個網址:
(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等軟體無法識別。