Skip to content

Commit f3c09a8

Browse files
authored
Merge pull request #491 from Shane32/allow_custom_png_image_in_svg
Support passing PNG data directly to SvgLogo
2 parents c200d43 + 4b8fafd commit f3c09a8

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

QRCoder/SvgQRCode.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ public SvgLogo(Bitmap iconRasterized, int iconSizePercent = 15, bool fillLogoBac
285285
using (var bitmap = new Bitmap(iconRasterized))
286286
{
287287
bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
288-
_logoData = Convert.ToBase64String(ms.GetBuffer(), Base64FormattingOptions.None);
288+
_logoData = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length, Base64FormattingOptions.None);
289289
}
290290
}
291291
_mediaType = MediaType.PNG;
@@ -312,6 +312,22 @@ public SvgLogo(string iconVectorized, int iconSizePercent = 15, bool fillLogoBac
312312
_isEmbedded = iconEmbedded;
313313
}
314314

315+
/// <summary>
316+
/// Create a logo object to be used in SvgQRCode renderer
317+
/// </summary>
318+
/// <param name="iconRasterized">Logo to be rendered as PNG</param>
319+
/// <param name="iconSizePercent">Degree of percentage coverage of the QR code by the logo</param>
320+
/// <param name="fillLogoBackground">If true, the background behind the logo will be cleaned</param>
321+
public SvgLogo(byte[] iconRasterized, int iconSizePercent = 15, bool fillLogoBackground = true)
322+
{
323+
_iconSizePercent = iconSizePercent;
324+
_logoData = Convert.ToBase64String(iconRasterized, Base64FormattingOptions.None);
325+
_mediaType = MediaType.PNG;
326+
_fillLogoBackground = fillLogoBackground;
327+
_logoRaw = iconRasterized;
328+
_isEmbedded = false;
329+
}
330+
315331
/// <summary>
316332
/// Returns the raw logo's data
317333
/// </summary>

QRCoderTests/SvgQRCodeRendererTests.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public void can_render_svg_qrcode_without_quietzones_hex()
106106
#if NETFRAMEWORK || NETSTANDARD2_0 || NET5_0 || NET6_0_WINDOWS
107107
[Fact]
108108
[Category("QRRenderer/SvgQRCode")]
109-
public void can_render_svg_qrcode_with_png_logo()
109+
public void can_render_svg_qrcode_with_png_logo_bitmap()
110110
{
111111
//Create QR code
112112
var gen = new QRCodeGenerator();
@@ -120,10 +120,29 @@ public void can_render_svg_qrcode_with_png_logo()
120120
var svg = new SvgQRCode(data).GetGraphic(10, Color.DarkGray, Color.White, logo: logoObj);
121121

122122
var result = HelperFunctions.StringToHash(svg);
123-
result.ShouldBe("78e02e8ba415f15817d5ed88c4afca31");
123+
result.ShouldBe("78e02e8ba415f15817d5ed88c4afca31");
124124
}
125125
#endif
126126

127+
[Fact]
128+
[Category("QRRenderer/SvgQRCode")]
129+
public void can_render_svg_qrcode_with_png_logo_bytearray()
130+
{
131+
//Create QR code
132+
var gen = new QRCodeGenerator();
133+
var data = gen.CreateQrCode("This is a quick test! 123#?", QRCodeGenerator.ECCLevel.H);
134+
135+
//Used logo is licensed under public domain. Ref.: https://thenounproject.com/Iconathon1/collection/redefining-women/?i=2909346
136+
var logoBitmap = System.IO.File.ReadAllBytes(GetAssemblyPath() + "\\assets\\noun_software engineer_2909346.png");
137+
var logoObj = new SvgQRCode.SvgLogo(iconRasterized: logoBitmap, 15);
138+
logoObj.GetMediaType().ShouldBe<SvgQRCode.SvgLogo.MediaType>(SvgQRCode.SvgLogo.MediaType.PNG);
139+
140+
var svg = new SvgQRCode(data).GetGraphic(10, Color.DarkGray, Color.White, logo: logoObj);
141+
142+
var result = HelperFunctions.StringToHash(svg);
143+
result.ShouldBe("7d53f25af04e52b20550deb2e3589e96");
144+
}
145+
127146
[Fact]
128147
[Category("QRRenderer/SvgQRCode")]
129148
public void can_render_svg_qrcode_with_svg_logo_embedded()

0 commit comments

Comments
 (0)