C# 生成 聯絡人 二維碼
阿新 • • 發佈:2021-02-08
- NuGet 引用庫
- 不廢話貼程式碼:
using Gma.QrCodeNet.Encoding; using Gma.QrCodeNet.Encoding.Windows.Render; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test { /// <summary> /// 通訊錄元素物件 /// </summary> public class VCard { /// <summary> /// 電話型別 /// </summary> public enum TelType { /// <summary> /// 手機 /// </summary> CELL, /// <summary> /// 家庭 /// </summary> HOME, /// <summary> /// 工作 /// </summary> WORK, /// <summary> /// 視訊 /// </summary> VIDEO, /// <summary> /// 預設 /// </summary> VOICE } /// <summary> /// 聯絡人電話號碼 /// </summary> public class VCardTel { /// <summary> /// 電話號歸類 /// </summary> public static Dictionary<string, string> VCardTelType { get; private set; } /// <summary> /// 電話號歸類名稱 /// </summary> public string TelTypeCaptin { get; set; } /// <summary> /// 電話號歸類 /// </summary> public string TelType { get; set; } /// <summary> /// 電話號 /// </summary> public string Tel { get; set; } /// <summary> /// 聯絡電話號碼 /// </summary> static VCardTel() { VCardTelType = new Dictionary<string, string>() { {"CELL","手機" }, {"HOME","家庭" }, {"WORK","工作" }, {"VIDEO","視訊" }, {"VOICE","預設" }, }; } /// <summary> /// 建立一個預設聯絡電話 /// </summary> public VCardTel() { TelTypeCaptin = "工作"; TelType = "WORK"; } /// <summary> /// 建立聯絡電話 /// </summary> /// <param name="tel"></param> /// <param name="type"></param> public VCardTel(string tel, string type) { if (VCardTelType.ContainsKey(type)) { this.TelType = type; this.TelTypeCaptin = VCardTelType[type]; } this.Tel = tel; } /// <summary> /// 建立聯絡電話 /// </summary> /// <param name="tel"></param> /// <param name="type"></param> public VCardTel(string tel, TelType type = VCard.TelType.WORK) : this(tel, type.ToString()) { } } /// <summary> /// 聯絡人姓名 /// </summary> public string Name { get; set; } /// <summary> /// 聯絡人電話號碼 /// </summary> public List<VCardTel> Tels { get; set; } /// <summary> /// 聯絡人地址 /// </summary> public string Addr { get; set; } /// <summary> /// 聯絡人郵件 /// </summary> public string Email { get; set; } /// <summary> /// 聯絡人單位 /// </summary> public string Org { get; set; } /// <summary> /// 建立一個聯絡人 /// </summary> public VCard() { this.Tels = new List<VCardTel>(); } /// <summary> /// 建立一個聯絡並初始化資料 /// </summary> /// <param name="name"></param> /// <param name="tel"></param> public VCard(string name, string tel) : this() { this.Name = name; this.Tels.Add(new VCardTel(tel, TelType.WORK)); } /// <summary> /// 新增一個電話 /// </summary> /// <param name="tel"></param> /// <param name="type"></param> public void AddTel(string tel, TelType type = TelType.WORK) { if (this.Tels.Where(i => i.Tel == tel).Count() == 0) this.Tels.Add(new VCardTel(tel, type)); } /// <summary> /// 講一個json序列化的聯絡人轉聯絡人物件 /// </summary> /// <param name="json"></param> /// <param name="card"></param> /// <returns></returns> public bool TryParse(string json, out VCard card) { card = null; var reuslt = false; try { if (string.IsNullOrWhiteSpace(json) == false) { card = Newtonsoft.Json.JsonConvert.DeserializeObject<VCard>(json); reuslt = true; } } catch (Exception exc) { #if DEBUG Console.WriteLine(exc); #endif } return reuslt; } /// <summary> /// 獲取聯絡人字串 /// </summary> /// <returns></returns> public override string ToString() { if (string.IsNullOrWhiteSpace(Name) || Tels.Count == 0) return "please input Name and Tels value"; var result = new StringBuilder(); result.AppendLine("BEGIN:VCARD VERSION:3.0"); result.AppendLine($"N:;{Name};;;"); result.AppendLine($"FN:{Name}"); result.AppendLine(string.Join("\r\n", Tels.Select(i => $"TEL;TYPE={i.TelType}:{i.Tel}"))); if (!string.IsNullOrWhiteSpace(Email)) result.AppendLine($"EMAIL;TYPE=internet:{Email}"); if (!string.IsNullOrWhiteSpace(Addr)) result.AppendLine($"ADR;TYPE=WORK;CHARSET=UTF-8:;;{Addr};;;;"); if (!string.IsNullOrWhiteSpace(Org)) result.AppendLine($"ORG;CHARSET=UTF-8:{Org}"); result.AppendLine("END:VCARD"); return result.ToString(); } /// <summary> /// 序列號物件 預設json格式化 /// </summary> /// <param name="format">j:轉json格式; v:轉vcard格式</param> /// <returns>格式化後字串</returns> public string ToString(string format) { string result; if (format?.ToLower() == "v") result = this.ToString(); else result = Newtonsoft.Json.JsonConvert.SerializeObject(this); return result; } /// <summary> /// 生成二維碼 /// </summary> /// <param name="directory"></param> /// <returns></returns> public string SaveGma(DirectoryInfo directory) { string filePath = Path.Combine(directory.FullName, $"{Name}{DateTime.Now:yyyyMMddHHmmss}.png"); string vcard = ToString(); var encoder = new QrEncoder(ErrorCorrectionLevel.M); if (encoder.TryEncode(vcard, out QrCode qrCode)) { var gRenderer = new GraphicsRenderer( new FixedModuleSize(2, QuietZoneModules.Two), Brushes.Black, Brushes.White); using (FileStream file = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { gRenderer.WriteToStream(qrCode.Matrix, ImageFormat.Png, file); } } else return null; return filePath; } } }
- 呼叫測試程式碼:
VCard card = new VCard("一個菜鳥", "110"); card.Addr = "四川省成都市武侯"; card.Org = "恭喜發財"; card.Email = "[email protected]"; card.AddTel("110", VCard.TelType.HOME); var gmaFilePath= card.SaveGma(new System.IO.DirectoryInfo(@"C:\Users\logxo\source\repos\getLonbon\bin\Debug"));
開啟二維碼,掃描一下測試結果