.NET使用ZXing.NET生成中间带图片的二维码

很久之前就有写这样的代码了,只是一直没记录下来,偶然想写成博客。

把之前的代码封装成函数,以方便理解以及调用。

基于开源的 ZXing.NET 组件,代码如下:

先添加对ZXing.NET的引用,然后添加相应的命名空间:

using System;
using System.Collections.Generic;
using System.Drawing;
using ZXing;
using ZXing.Common;
using ZXing.QrCode;
using ZXing.QrCode.Internal;

方法一是生成二维码图片:

/// <summary>
/// 生成二维码图片
/// </summary>
/// <param name="contents">要生成二维码包含的信息</param>
/// <param name="width">生成的二维码宽度(默认300像素)</param>
/// <param name="height">生成的二维码高度(默认300像素)</param>
/// <returns>二维码图片</returns>
public static Bitmap GeneratorQrImage(string contents, int width = 300, int height = 300)
{
    if (string.IsNullOrEmpty(contents))
    {
        return null;
    }
    //本文地址:http://www.cnblogs.com/Interkey/p/qrcode.html
    EncodingOptions options = null;
    BarcodeWriter writer = null;
    options = new QrCodeEncodingOptions
    {
        DisableECI = true,
        CharacterSet = "UTF-8",
        Width = width,
        Height = height,
        ErrorCorrection = ErrorCorrectionLevel.H,
    };
    writer = new BarcodeWriter();
    writer.Format = BarcodeFormat.QR_CODE;
    writer.Options = options;

    Bitmap bitmap = writer.Write(contents);
    return bitmap;
}

方法二是生成中间带图片的二维码图片:

/// <summary>
/// 生成中间带有图片的二维码图片
/// </summary>
/// <param name="contents">要生成二维码包含的信息</param>
/// <param name="middleImg">要生成到二维码中间的图片</param>
/// <param name="width">生成的二维码宽度(默认300像素)</param>
/// <param name="height">生成的二维码高度(默认300像素)</param>
/// <returns>中间带有图片的二维码</returns>
public static Bitmap GeneratorQrImage(string contents, Image middleImg, int width = 300, int height = 300)
{
    if (string.IsNullOrEmpty(contents))
    {
        return null;
    }
    if (middleImg == null)
    {
        //return null;
        return GeneratorQrImage(contents);
    }
    ////本文地址:http://www.cnblogs.com/Interkey/p/qrcode.html
    //构造二维码写码器
    MultiFormatWriter mutiWriter = new MultiFormatWriter();
    Dictionary<EncodeHintType, object> hint = new Dictionary<EncodeHintType, object>();
    hint.Add(EncodeHintType.CHARACTER_SET, "UTF-8");
    hint.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

    //生成二维码
    BitMatrix bm = mutiWriter.encode(contents, BarcodeFormat.QR_CODE, width, height, hint);
    BarcodeWriter barcodeWriter = new BarcodeWriter();
    Bitmap bitmap = barcodeWriter.Write(bm);

    //获取二维码实际尺寸(去掉二维码两边空白后的实际尺寸)
    int[] rectangle = bm.getEnclosingRectangle();

    //计算插入图片的大小和位置
    int middleImgW = Math.Min((int)(rectangle[2] / 3.5), middleImg.Width);
    int middleImgH = Math.Min((int)(rectangle[3] / 3.5), middleImg.Height);
    int middleImgL = (bitmap.Width - middleImgW) / 2;
    int middleImgT = (bitmap.Height - middleImgH) / 2;

    //将img转换成bmp格式,否则后面无法创建 Graphics对象
    Bitmap bmpimg = new Bitmap(bitmap.Width, bitmap.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
    using (Graphics g = Graphics.FromImage(bmpimg))
    {
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        g.DrawImage(bitmap, 0, 0);
    }

    //在二维码中插入图片
    Graphics myGraphic = Graphics.FromImage(bmpimg);
    //白底
    myGraphic.FillRectangle(Brushes.White, middleImgL, middleImgT, middleImgW, middleImgH);
    myGraphic.DrawImage(middleImg, middleImgL, middleImgT, middleImgW, middleImgH);
    return bmpimg;
}

效果如下:

中间有图片与没有图片的生成的不一样,原因不清楚,初步以为中间有图片的是因为容错率的原故。

对应的解析代码也很简单:

// create a barcode reader instance
IBarcodeReader reader = new BarcodeReader();
// load a bitmap
Bitmap barcodeBitmap = (Bitmap)Image.FromFile("C:\\sample-barcode-image.png");
// detect and decode the barcode inside the bitmap
Result result = reader.Decode(barcodeBitmap);
// do something with the result
if (result != null)
{
    this.txtDecoderType.Text = result.BarcodeFormat.ToString();
    this.txtDecoderContent.Text = result.Text;
}

以上是生成和解析二维码的代码,至于生成一维码和对应的解析也很简单。

其他常用可生成二维码的组件有:QrCode.Net(开源)、ZXing(开源)、ThoughtWorks.QRCode等。

了解了二维码的数据存储后,可以基于这些技术生成富有创意的二维码。



参考:

  1. QR二维码生成器源码(中间可插入小图片)
  2. 用C#实现的条形码和二维码编码解码器
  3. 如何在ASP.NET和WPF中显示二维码
  4. C#利用QrCode.Net生成二维码(Qr码)
  5. 二维码的生成细节和原理
  6. 带你探索条形码世界的奥秘
  7. Android二维码识别 开源项目ZXing的编译
时间: 2024-11-08 19:14:27

.NET使用ZXing.NET生成中间带图片的二维码的相关文章

js实现生成中间带图片的二维码

之前需要实现生成中间带图片的二维码,所以找了半天终于找到一个可以用的.于是在这里记录一下. 下面是需要注意的几点: 1.使用的js为jquery-qrcode 但是已经经过别人的修改,和网上原来的那些不一样,所以网上的js不能用. 2.生成的图片大小可以调整 3.我尽可能保留了原作者的所有代码,都没有动过. 4.更多的方法和参数还是要参考官方的github和文档. http://files.cnblogs.com/files/linkstar/%E7%94%9F%E6%88%90%E4%B8%A

Android使用ZXing生成带图片的二维码

效果图如下: 制作过程很简单的就是在原始的二维码图片上添加一个logn图标,代码的注释写得很详细,也就不给大家啰嗦了 package com.example.day44_02_qrcodewithlogin; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Bitmap.Confi

Android生成带图片的二维码

一.问题描述 在开发中需要将信息转换为二维码存储并要求带有公司的logo,我们知道Google的Zxing开源项目就很好的帮助我们实现条形码.二维码的生成和解析,但带有logo的官网并没有提供demo,下面就通过实例看看如何实现以及Zxing的使用. 二.案例介绍 1.案例运行效果 2.案例准备工作 在项目中加入jar,只需加入core.jar Zxing项目地址:https://github.com/zxing/zxing/ 三.Zxing主要组件 1.BarcodeFormat 定义了不同的

python 生成待图片的二维码代码

imge.show()在Liunx下可能不行. ps:标准版本的show()方法不是很有效率,因为它先将图像保存为一个临时文件,然后使用xv进行显示.如果没有安装xv,该函数甚至不能工作.但是该方法非常便于debug和test.(windows中应该调用默认图片查看器打开) 代码如下: #-*-coding:utf-8-*- #这是一个二维码的生成代码 import qrcode import os from PIL import Image import Pillow print() clas

友盟自定义分享-生成带图片的二维码,自定义分享布局

public class UmengShare { private Activity activity = null; private UMSocialService mController = null; private Dialog shareDialog = null; private Bitmap bitmapCode = null; public UmengShare(Activity activity){ this.activity = activity; } public void

使用 Qrcode 生成中间带 logo 的二维码!

可以自由定义生成的二维码中间是否带 logo ! package com.controller; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import

涛哥的Python脚本工具箱之生成带Logo的二维码

近期须要在二维码上加Logo,网上没有找到好用的,于是自己用python写了一个. 须要安装qrcode,PIL库 二维码简称 QR Code(Quick Response Code),学名为高速响应矩阵码,是二维条码的一种.由日本的 Denso Wave 公司于 1994 年发明. 现随着智能手机的普及.已广泛应用于寻常生活中,比如商品信息查询.社交好友互动.网络地址訪问等等. 安装 Python 的二维码库 -- qrcode pip install qrcode 因为生成 qrcode 图

C# ZXing.Net生成二维码、识别二维码、生成带Logo的二维码(一)

一.ZXing.Net 源代码地址:http://zxingnet.codeplex.com/ 也可以使用Nuget包管理,添加如图: 说明:ZXing是一个开源Java类库用于解析多种格式的1D/2D条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME.J2SE和Android.现在也有了对应的.Net版本 二.生成二维码 将字符编码时可以指定字符格式:默认为ISO-8859-1英文字符集,但一般移动设备常用UTF-8字符

生成带内嵌图片的二维码

在博问上看到有同学在问如何实现一个带内嵌图片的二维码,所以准备记录下来,供同学们参考. 1.首先准备一个用于内嵌的图片. 2.既然生成二维码码,那肯定需要将什么样的内容生成二维码,这里我用http://www.baidu.com作为生成二维码的字符串 private string QcodeSource { get { return "http://www.baidu.com"; } } 3.我们来看看根据QcodeSource生成二维码的方法,这里返回Byte[].PS:这里用了 G