#if NET40 || NET461 using System; using System.Collections.Generic; using System.Text; namespace Apewer.Internals.QrCode { internal class AsciiQRCode : AbstractQRCode, IDisposable { /// /// Constructor without params to be used in COM Objects connections /// public AsciiQRCode() { } public AsciiQRCode(QRCodeData data) : base(data) { } /// /// Returns a strings that contains the resulting QR code as ASCII chars. /// /// Number of repeated darkColorString/whiteSpaceString per module. /// public string GetGraphic(int repeatPerModule) { return string.Join("\n", GetLineByLineGraphic(repeatPerModule)); } /// /// Returns a strings that contains the resulting QR code as ASCII chars. /// /// Number of repeated darkColorString/whiteSpaceString per module. /// String for use as dark color modules. In case of string make sure whiteSpaceString has the same length. /// String for use as white modules (whitespace). In case of string make sure darkColorString has the same length. /// End of line separator. (Default: \n) /// public string GetGraphic(int repeatPerModule, string darkColorString, string whiteSpaceString, string endOfLine = "\n") { return string.Join(endOfLine, GetLineByLineGraphic(repeatPerModule, darkColorString, whiteSpaceString)); } /// /// Returns an array of strings that contains each line of the resulting QR code as ASCII chars. /// /// Number of repeated darkColorString/whiteSpaceString per module. /// public string[] GetLineByLineGraphic(int repeatPerModule) { return GetLineByLineGraphic(repeatPerModule, "██", " "); } /// /// Returns an array of strings that contains each line of the resulting QR code as ASCII chars. /// /// Number of repeated darkColorString/whiteSpaceString per module. /// String for use as dark color modules. In case of string make sure whiteSpaceString has the same length. /// String for use as white modules (whitespace). In case of string make sure darkColorString has the same length. /// public string[] GetLineByLineGraphic(int repeatPerModule, string darkColorString, string whiteSpaceString) { var qrCode = new List(); //We need to adjust the repeatPerModule based on number of characters in darkColorString //(we assume whiteSpaceString has the same number of characters) //to keep the QR code as square as possible. var adjustmentValueForNumberOfCharacters = darkColorString.Length / 2 != 1 ? darkColorString.Length / 2 : 0; var verticalNumberOfRepeats = repeatPerModule + adjustmentValueForNumberOfCharacters; var sideLength = QrCodeData.ModuleMatrix.Count * verticalNumberOfRepeats; for (var y = 0; y < sideLength; y++) { bool emptyLine = true; var lineBuilder = new StringBuilder(); for (var x = 0; x < QrCodeData.ModuleMatrix.Count; x++) { var module = QrCodeData.ModuleMatrix[x][(y + verticalNumberOfRepeats) / verticalNumberOfRepeats - 1]; for (var i = 0; i < repeatPerModule; i++) { lineBuilder.Append(module ? darkColorString : whiteSpaceString); } if (module) { emptyLine = false; } } if (!emptyLine) { qrCode.Add(lineBuilder.ToString()); } } return qrCode.ToArray(); } } } #endif