下载 phpqrcode.php
引用
include_once 'phpqrcode.php';
使用phpqrcode.php png生成二维码
// 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);
参数分析:
参数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,生成二维码的大小
参数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。然后生成图片,发现效果还是不错的。
发表评论