1
+ using System ;
2
+ using System . Drawing ;
3
+ using System . Drawing . Drawing2D ;
4
+
5
+ namespace QRCoder
6
+ {
7
+ public class LogoQRCode : AbstractQRCode , IDisposable
8
+ {
9
+ /// <summary>
10
+ /// Constructor without params to be used in COM Objects connections
11
+ /// </summary>
12
+ public LogoQRCode ( ) { }
13
+
14
+ public LogoQRCode ( QRCodeData data ) : base ( data ) { }
15
+
16
+ public Bitmap GetGraphic ( QRCodeData qrCodeData ,
17
+ int pixelsPerModule ,
18
+ int pixelSize ,
19
+ Color darkColor ,
20
+ Color lightColor ,
21
+ bool drawQuietZones = false ,
22
+ Bitmap reticalImage = null ,
23
+ Base64QRCode . ImageType imgType = Base64QRCode . ImageType . Png ,
24
+ Bitmap backgroundImage = null )
25
+ {
26
+ int numModules = qrCodeData . ModuleMatrix . Count - ( drawQuietZones ? 0 : 8 ) ;
27
+ var offset = ( drawQuietZones ? 0 : 4 ) ;
28
+ int size = numModules * pixelsPerModule ;
29
+ var moduleMargin = pixelsPerModule - pixelSize ;
30
+
31
+ Bitmap bitmap = backgroundImage ?? new Bitmap ( size , size ) ;
32
+ bitmap = Resize ( bitmap , size ) ;
33
+
34
+ using ( Graphics graphics = Graphics . FromImage ( bitmap ) )
35
+ {
36
+ using ( SolidBrush lightBrush = new SolidBrush ( lightColor ) )
37
+ {
38
+ using ( SolidBrush darkBrush = new SolidBrush ( darkColor ) )
39
+ {
40
+ // make background transparent if you don't have an image
41
+ if ( backgroundImage == null )
42
+ {
43
+ using ( var brush = new SolidBrush ( Color . Transparent ) )
44
+ {
45
+ graphics . FillRectangle ( brush , new Rectangle ( 0 , 0 , size , size ) ) ;
46
+ }
47
+ }
48
+
49
+ for ( int x = 0 ; x < numModules ; x += 1 )
50
+ {
51
+ for ( int y = 0 ; y < numModules ; y += 1 )
52
+ {
53
+ var solidBrush = ( Brush ) ( qrCodeData . ModuleMatrix [ offset + y ] [ offset + x ] ? darkBrush : lightBrush ) ;
54
+
55
+ if ( IsPartOfRetical ( x , y , numModules , offset ) )
56
+ if ( reticalImage == null )
57
+ graphics . FillRectangle ( solidBrush , new Rectangle ( x * pixelsPerModule , y * pixelsPerModule , pixelsPerModule , pixelsPerModule ) ) ;
58
+ else
59
+ graphics . FillEllipse ( solidBrush , new Rectangle ( x * pixelsPerModule + moduleMargin , y * pixelsPerModule + moduleMargin , pixelSize , pixelSize ) ) ;
60
+ }
61
+ }
62
+
63
+ if ( reticalImage != null )
64
+ {
65
+ var reticleSize = 7 * pixelsPerModule ;
66
+ graphics . DrawImage ( reticalImage , new Rectangle ( 0 , 0 , reticleSize , reticleSize ) ) ;
67
+ graphics . DrawImage ( reticalImage , new Rectangle ( size - reticleSize , 0 , reticleSize , reticleSize ) ) ;
68
+ graphics . DrawImage ( reticalImage , new Rectangle ( 0 , size - reticleSize , reticleSize , reticleSize ) ) ;
69
+ }
70
+
71
+ graphics . Save ( ) ;
72
+ }
73
+ }
74
+ }
75
+ return bitmap ;
76
+ }
77
+
78
+ private bool IsPartOfRetical ( int x , int y , int numModules , int offset )
79
+ {
80
+ var cornerSize = 7 + offset ;
81
+ return
82
+ ( x < cornerSize && y < cornerSize ) ||
83
+ ( x > ( numModules - cornerSize ) && y < cornerSize ) ||
84
+ ( x < cornerSize && y < ( numModules - cornerSize ) ) ;
85
+ }
86
+
87
+ private Bitmap Resize ( Bitmap image , int size )
88
+ {
89
+ float scale = Math . Min ( ( float ) size / image . Width , ( float ) size / image . Height ) ;
90
+ var scaleWidth = ( int ) ( image . Width * scale ) ;
91
+ var scaleHeight = ( int ) ( image . Height * scale ) ;
92
+ var scaledImage = new Bitmap ( image , new Size ( scaleWidth , scaleHeight ) ) ;
93
+
94
+ var bm = new Bitmap ( size , size ) ;
95
+
96
+ using ( Graphics graphics = Graphics . FromImage ( bm ) )
97
+ {
98
+ using ( var brush = new SolidBrush ( Color . Transparent ) )
99
+ {
100
+ graphics . FillRectangle ( brush , new Rectangle ( 0 , 0 , size , size ) ) ;
101
+
102
+ graphics . InterpolationMode = InterpolationMode . High ;
103
+ graphics . CompositingQuality = CompositingQuality . HighQuality ;
104
+ graphics . SmoothingMode = SmoothingMode . AntiAlias ;
105
+ graphics . DrawImage ( scaledImage , new Rectangle ( ( size / 2 ) - ( scaledImage . Width / 2 ) , ( size / 2 ) - ( scaledImage . Height / 2 ) , scaledImage . Width , scaledImage . Height ) ) ;
106
+ }
107
+ }
108
+
109
+ return bm ;
110
+ }
111
+ }
112
+ }
0 commit comments