分享二维码(网址路径生成可分享的二维码)

这里是俩种分享方式,这次要实现的是图片二维码分享。

其实这个实现的逻辑就是把网址弄成二维码。

/// <summary>
/// 普通二维码
/// </summary>
/// <param name="str">存储内容</param>
/// <param name="pixel">像素大小</param>
/// <returns>返回一个Bitmap对象,表示生成的二维码</returns>
private static Bitmap GetQRCode(string str, int pixel)
{
    // 创建一个QRCodeGenerator的实例
    QRCodeGenerator generator = new QRCodeGenerator();

    // 使用QRCodeGenerator实例生成二维码数据
    // 参数分别是:存储内容,错误纠正水平(这里使用M级),是否强制UTF-8编码
    QRCodeData codeData = generator.CreateQrCode(str, QRCodeGenerator.ECCLevel.M, true);

    // 使用生成的二维码数据创建一个QRCode对象
    QRCode qrcode = new QRCode(codeData);

    // 使用QRCode对象获取二维码图像
    // 参数分别是:像素大小,前景色(二维码颜色),背景色,是否添加边框
    Bitmap qrImage = qrcode.GetGraphic(pixel, Color.Black, Color.White, true);

    // 返回生成的二维码图像
    return qrImage;
}

其中错误纠正级别被设置为 QRCodeGenerator.ECCLevel.QECCLevel.Q 代表最高级别的错误纠正,可以恢复最多25%的错误。这意味着即使二维码被部分损坏,它仍然可以被正确扫描。这行代码没有提到是否强制使用UTF-8编码,因此默认情况下,它不会强制使用UTF-8编码。强制使用UTF-8编码对包含非ASCII字符的字符串非常重要,因为它确保了二维码在不同的扫描仪和读取器上可以被正确解析。

str就是上图的网址(http://xxx/activity/detail/2_11

然后我这还有一个需求就是把二维码镶嵌在一个图片里,所以我这边还需要一个两张图片合成一张图片的方法,如不需要可以跳过。

/// <summary>
/// 合并二维码图片
/// </summary>
/// <param name="img1">第一张图片</param>
/// <param name="img2">第二张图片</param>
/// <returns>返回一个Bitmap对象,表示合并后的图片</returns>
public static Bitmap CombinImage(Image img1, Image img2)
{
    try
    {
        // 创建一个新的Bitmap对象,大小与第一张图片相同
        Bitmap bmp = new Bitmap(img1.Width, img1.Height);

        // 创建Graphics对象,用于绘制图像
        Graphics g = Graphics.FromImage(bmp);
        
        // 清除整个绘图面并以白色填充
        g.Clear(Color.White);
        
        // 绘制第一张图片
        g.DrawImage(img1, 0, 0, img1.Width, img1.Height);

        // 绘制第二张图片,指定位置和大小
        // 第二张图片被放置在(185, 420)的位置,大小为380x380像素
        g.DrawImage(img2, 185, 420, 380, 380);

        // 强制执行垃圾回收,释放资源
        GC.Collect();
        
        // 返回合并后的图片
        return bmp;
    }
    catch (Exception ex)
    {
        // 如果发生异常,返回null
        return null;
    }
}

这个方法接受两个 Image 类型的参数:img1 和 img2,分别代表要合并的第一张和第二张图片。方法返回一个 Bitmap 对象,这个对象包含了合并后的图片。

方法的工作流程如下:

  1. 创建一个新的 Bitmap 对象,大小与第一张图片相同。
  2. 创建一个 Graphics 对象,用于在 Bitmap 上绘制。
  3. 清除 Graphics 对象的绘图面,并用白色填充。
  4. 使用 DrawImage 方法绘制第一张图片,从图片的左上角开始(x,y坐标是以图片左上角点为0点的),大小不变。
  5. 使用 DrawImage 方法绘制第二张图片,指定其在 Bitmap 上的位置和大小。在这里,第二张图片被放置在坐标 (185, 420) 的位置,并且被缩放到 380x380 像素的大小。
  6. 调用 GC.Collect() 来强制执行垃圾回收,释放不再使用的资源。
  7. 返回合并后的 Bitmap 对象。

如果在合并过程中发生任何异常,方法将捕获异常并返回 null

至此我还问过一个傻问题:Bitmap和Graphics的区别?

小小解释一下:Bitmap对象代表的是图像数据,可以在内存中加载、操作和保存位图,可以用来获取或设置图像的像素颜色、尺寸等信息等。而Graphics对象提供了绘制图像的方法和功能。

进入正题

        /// <summary>
        /// 合成二维码
        /// </summary>
        public static string UniteImage(string str)
        {
            try
            {
                var dateNow = DateTime.Now;
                string Filepath = "D:\\Darlin\\wwwroot";
                //Temp里面的都是存的临时文件,基本生成都是存到临时文件夹中了
                string savePath = "/UploadFile/Temp/" + DateTime.Now.ToString("yyyyMMdd")+"活动分享.jpg";


                Bitmap QrCodeBitmap = GetQRCode(str, 24);

                string QRCodefileName = "Darlin活动分享.png";
                string filesavepath = Filepath+ "/UploadFile/Temp/" + QRCodefileName;//这里是生成的二维码图片路径
                QrCodeBitmap.Save(filesavepath);

                string filesavepath1 = Filepath + "/TemplateFile/活动分享.jpg";//这里是需要和二维码合并的另一张样式图片路径
                Image img1 = Image.FromFile(filesavepath1);//从文件系统中的指定路径加载图像
                Image img2 = Image.FromFile(filesavepath);

                Bitmap bmp = CombinImage(img1, img2);// 合并两张图片
                bmp.Save(Filepath + savePath, ImageFormat.Png);
                Console.WriteLine("文件保存成功!");
                bmp.Clone();
                return savePath;
            }
            catch (Exception ex)
            {
                return "";
            }
        }

这是路径 D:\Darlin\wwwroot\TemplateFile 里的样式图:

这是路径 D:\Darlin\wwwroot\UploadFile\Temp 里生成的最终结果图:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值