Skip to content

Commit b8654c6

Browse files
committed
Support passing PNG logos directly to SvgLogo
1 parent dd35a3b commit b8654c6

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;
@@ -311,6 +311,22 @@ public SvgLogo(string iconVectorized, int iconSizePercent = 15, bool fillLogoBac
311311
_isEmbedded = iconEmbedded;
312312
}
313313

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

QRCoderTests/SvgQRCodeRendererTests.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void can_render_svg_qrcode_without_quietzones_hex()
105105

106106
[Fact]
107107
[Category("QRRenderer/SvgQRCode")]
108-
public void can_render_svg_qrcode_with_png_logo()
108+
public void can_render_svg_qrcode_with_png_logo_bitmap()
109109
{
110110
//Create QR code
111111
var gen = new QRCodeGenerator();
@@ -119,7 +119,26 @@ public void can_render_svg_qrcode_with_png_logo()
119119
var svg = new SvgQRCode(data).GetGraphic(10, Color.DarkGray, Color.White, logo: logoObj);
120120

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

125144
[Fact]

0 commit comments

Comments
 (0)