-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathQR.cs
132 lines (111 loc) · 3.98 KB
/
QR.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using ZXing;
using ZXing.QrCode;
using ZXing.QrCode.Internal;
using ZXing.Rendering;
namespace nqrgen
{
public class QR
{
private readonly string data;
private readonly Options options;
protected QR(string data, Options options)
{
this.data = data;
this.options = options;
}
public static QR New(string data, Options options)
{
return new QR(data, options);
}
public void Process()
{
if (!options.Directory.Exists) options.Directory.Create();
ErrorCorrectionLevel correction = default;
switch (options.Correction)
{
case ErrorCorrection.Low:
correction = ErrorCorrectionLevel.L;
break;
case ErrorCorrection.Medium:
correction = ErrorCorrectionLevel.M;
break;
case ErrorCorrection.Quite:
correction = ErrorCorrectionLevel.Q;
break;
case ErrorCorrection.High:
correction = ErrorCorrectionLevel.H;
break;
default:
correction = ErrorCorrectionLevel.M;
break;
}
BarcodeWriterPixelData writer = createBarcodeWriterPixelData(correction, options.Size, options.Margin);
PixelData pixelData = createPixelData(writer, data);
using Bitmap bitmap = createBitmap(pixelData);
BitmapData bitmapData = createBitmapData(bitmap, pixelData);
try
{
Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
}
finally
{
bitmap.UnlockBits(bitmapData);
}
var filePath = Path.Join(options.Directory.FullName, data) + ".png";
using FileStream fileStream = File.OpenWrite(filePath);
bitmap.Save(fileStream, ImageFormat.Png);
}
public static PixelData createPixelData(IBarcodeWriterPixelData qrWriter, string data)
{
PixelData pixelData = qrWriter.Write(data);
return pixelData;
}
public static Bitmap createBitmap(PixelData pixelData)
{
Bitmap bitmap = new Bitmap(pixelData.Width, pixelData.Height, PixelFormat.Format32bppRgb);
return bitmap;
}
public static BitmapData createBitmapData(Bitmap bitmap, PixelData pixelData)
{
var bitmapData = bitmap.LockBits(new Rectangle(0, 0, pixelData.Width, pixelData.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppRgb);
return bitmapData;
}
public static BarcodeWriterPixelData createBarcodeWriterPixelData(ErrorCorrectionLevel correction, int size = 30, int margin = 0)
{
var qrCodeWriter = new BarcodeWriterPixelData
{
Format = BarcodeFormat.QR_CODE,
Options = new QrCodeEncodingOptions
{
Height = size,
Width = size,
Margin = margin,
ErrorCorrection = correction
},
};
return qrCodeWriter;
}
public static BarcodeWriter createBarcodeWriterForConsole()
{
var qrCodeWriter = new BarcodeWriter
{
Format = BarcodeFormat.QR_CODE,
Options = new QrCodeEncodingOptions
{
Height = 1,
Width = 1,
Margin = 1,
ErrorCorrection = ErrorCorrectionLevel.L
},
Renderer = new CustomBitmapRenderer()
};
return qrCodeWriter;
}
}
}