You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# API二维码生成问题:命名空间错误及Logo不显示排查

问题1:编写C# API实现文本转二维码时出现'QRCode'命名空间错误

以下是针对性解决步骤:

  • 安装正确的NuGet包:确保项目已安装QRCoder库,可通过NuGet包管理器搜索安装,或执行命令:
    • .NET Framework:Install-Package QRCoder
    • .NET Core/.NET 5+:dotnet add package QRCoder
  • 修正命名空间引用:代码中添加正确的using语句:using QRCoder;(注意是QRCoder,不是QRCode,大小写敏感)
  • 清理重建项目:右键解决方案选择“清理解决方案”,再重建项目,解决缓存导致的命名空间识别问题
  • 检查框架兼容性:QRCoder支持.NET Framework 4.0+、.NET Core 2.0+等,确认项目目标框架版本符合要求
问题2:QRCoder生成带Logo的二维码但Logo不显示(代码错误分析与修复)

代码错误分析

  1. 核心问题:修改后的带Logo二维码位图qrCodeImage未转换为字节数组,最终返回的还是原始无Logo的qrCodeBytes,导致Logo不显示
  2. 冗余代码:Bitmap logoBitmap的创建完全多余,直接使用logoImage即可
  3. 潜在问题:固定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 05:27:23