php生成二维码-PHP生成二维码

下载 phpqrcode.php

引用

include_once 'phpqrcode.php';

使用phpqrcode.php png生成二维码

二维码生成器_二维码生成php源码_php生成二维码

// phpqrcode.php
public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) 
{
    $enc = QRencode::factory($level, $size, $margin);
    return $enc->encodePNG($text, $outfile, $saveandprint=false);
}
// 实例   直接输出二维码 不保存
$image = new QRcode();
$image->png('http://mywrong.cc', false, 'L', 10, 1);
// 实例   将二维码保存名为qrcode.png的文件 不直接输出
$image = new QRcode();
$image->png('http://mywrong.cc', 'qrcode.png', 'L', 10, 1);

参数分析:

二维码生成php源码_php生成二维码_二维码生成器

参数1:内容,可以是链接(http(s)://xxx.com扫描后手动跳转)、文本、json字符串等。

参数2:默认为falsephp生成二维码,不生成文件,只返回二维码输出; 否则,必须给出保存二维码的路径和文件名

参数3:默认为L。该参数可以传递的值有L(QR_ECLEVEL_L, 7%)、M(QR_ECLEVEL_M, 15%)、Q(QR_ECLEVEL_Q, 25%)、H(QR_ECLEVEL_H, 30%) )。 该参数控制二维码容错率,不同参数表示二维码被覆盖面积的比例,即被覆盖的面积可以被识别

参数4:默认为3,生成二维码的大小

php生成二维码_二维码生成器_二维码生成php源码

参数5:默认为4,控制生成二维码的空白区域大小(生成无边框二维码值为0)

参数6:默认为false,保存二维码图片并显示php生成二维码,参数2必须传图片路径

最近做了一个生成二维码的项目,和几年前有所不同。 最近大家都喜欢在二维码中间加一个logo。

添加标志并不难,只需将两张图片叠在一起即可,但新的问题出现了,如果标志太大,则无法扫描二维码; 如果太小,就不会很明显。

上网查看网上生成二维码的地方,发现有容错率的设置,从7%到30%,容错率越高php 二维码生成,二维码的有效像素越多。

因为我们使用的是zxing,所以我们需要看看如何设置zxing的二维码容错能力。

看了zxing的源码,在QRCodeWriter.java中有这么一段话:

    ErrorCorrectionLevel errorCorrectionLevel = ErrorCorrectionLevel.L;
    if (hints != null) {
      ErrorCorrectionLevel requestedECLevel = (ErrorCorrectionLevel) hints.get(EncodeHintType.ERROR_CORRECTION);
      if (requestedECLevel != null) {
        errorCorrectionLevel = requestedECLevel;
      }
    }

这一段描述了默认的容错级别是L,代码中注释的是7%,实际上是比较低的。 设置方法也很明显,可以通过哈希表传入参数。 因此生成二维码的代码改为如下

/**
	 * 用字符串生成二维码
	 * 
	 * @param str
	 * @author zhouzhe@lenovo-cw.com
	 * @return
	 * @throws WriterException
	 */
	public static Bitmap Create2DCode(String str, int picWidth, int picHeight) throws WriterException {
		// 生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
		Hashtable hints = new Hashtable();
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		BitMatrix matrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, picWidth, picHeight, hints);
		int width = matrix.getWidth();
		int height = matrix.getHeight();
		// 二维矩阵转为一维像素数组,也就是一直横着排了
		int[] pixels = new int[width * height];
		for (int y = 0; y < height; y++) {
			for (int x = 0; x < width; x++) {
				if (matrix.get(x, y)) {
					pixels[y * width + x] = 0xff000000;
				} else {
					pixels[y * width + x] = 0xffffffff;
				}
			}
		}
		Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
		// 通过像素数组生成bitmap,具体参考api
		bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
		return bitmap;
	}

这样生成的二维码想要配合默认的容错级别L,像素密度大很多,容错率也提高了,这样中间的logo图片就可以放更大的logo了图像。

另外我发现默认生成的图片不仅是二维码,而且还有更宽的蓝色边框。 如果背景不是红色的话,会很难看。 然后我查了一下,

发现QRCodeWriter.java中,有一个变量QUIET_ZONE_SIZE; 是控制边框的长度,默认是4php 二维码生成,最小值是1。这里我们可以改成0或者1。然后生成图片,发现效果还是不错的。