C# API二维码生成问题:命名空间错误及Logo不显示排查
问题1:编写C# API实现文本转二维码时出现'QRCode'命名空间错误
以下是针对性解决步骤:
- 安装正确的NuGet包:确保项目已安装QRCoder库,可通过NuGet包管理器搜索安装,或执行命令:
- .NET Framework:
Install-Package QRCoder - .NET Core/.NET 5+:
dotnet add package QRCoder
- .NET Framework:
- 修正命名空间引用:代码中添加正确的using语句:
using QRCoder;(注意是QRCoder,不是QRCode,大小写敏感) - 清理重建项目:右键解决方案选择“清理解决方案”,再重建项目,解决缓存导致的命名空间识别问题
- 检查框架兼容性:QRCoder支持.NET Framework 4.0+、.NET Core 2.0+等,确认项目目标框架版本符合要求
问题2:QRCoder生成带Logo的二维码但Logo不显示(代码错误分析与修复)
代码错误分析
- 核心问题:修改后的带Logo二维码位图
qrCodeImage未转换为字节数组,最终返回的还是原始无Logo的qrCodeBytes,导致Logo不显示 - 冗余代码:
Bitmap logoBitmap的创建完全多余,直接使用logoImage即可 - 潜在问题:固定Logo尺寸80px可能导致变形;相对路径在部署环境可能找不到文件;未处理Logo尺寸超过二维码区域的情况
修复后的完整代码
using Microsoft.AspNetCore.Mvc; using QRCoder; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; namespace TodoAPI.Controllers { [ApiController] [Route("api/[controller]")] public class QRCodeController : ControllerBase { [HttpGet("GenerateQRCodeLogo")] public IActionResult GenerateQRCodeLogo(string text) { // 生成基础二维码 QRCodeGenerator qrGenerator = new QRCodeGenerator(); QRCodeData qrCodeData = qrGenerator.CreateQrCode(text, QRCodeGenerator.ECCLevel.Q); PngByteQRCode qrCode = new PngByteQRCode(qrCodeData); byte[] qrCodeBytes = qrCode.GetGraphic(20); string logoPath = @".\Controllers\logo.jpg"; using (Image logoImage = Image.FromFile(logoPath)) using (MemoryStream ms = new MemoryStream(qrCodeBytes)) using (Bitmap qrCodeImage = new Bitmap(Image.FromStream(ms))) using (Graphics graphics = Graphics.FromImage(qrCodeImage)) { // 计算Logo尺寸:不超过二维码边长的1/5,避免干扰识别 int maxLogoSize = qrCodeImage.Width / 5; int logoWidth = logoImage.Width > maxLogoSize ? maxLogoSize : logoImage.Width; int logoHeight = logoImage.Height > maxLogoSize ? maxLogoSize : logoImage.Height; // 计算Logo位置:居中 int posX = (qrCodeImage.Width - logoWidth) / 2; int posY = (qrCodeImage.Height - logoHeight) / 2; // 绘制Logo,保持比例且抗锯齿 graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.DrawImage(logoImage, posX, posY, logoWidth, logoHeight); // 将修改后的二维码转换为字节数组 using (MemoryStream outputMs = new MemoryStream()) { qrCodeImage.Save(outputMs, System.Drawing.Imaging.ImageFormat.Png); qrCodeBytes = outputMs.ToArray(); } } return File(qrCodeBytes, "image/png"); } } }
关键修改说明
- 将修改后的
qrCodeImage保存到新的MemoryStream,并更新qrCodeBytes为带Logo的字节数组 - 移除冗余的
logoBitmap创建逻辑,直接使用原始logoImage - 添加Logo尺寸自适应逻辑,避免过大干扰二维码识别
- 开启图形抗锯齿,提升Logo显示质量
- 规范using语句嵌套,优化资源释放
内容的提问来源于stack exchange,提问作者Nguyễn Huy
相关产品推荐
相关产品推荐

