PHP QR code是一款常用的二维码生成库,但是里面控制二维码图像尺寸的参数其实对于一般用户可能有点迷,并不是直接输入像素的。

正好,近期有个需求是要调整之前微信小程序二维码的接口,要求支持指定宽度。所以有了本文。

参考:https://www.cnblogs.com/frey/p/9159017.html
博主给出了个从像素计算size的公式:

$size = floor($width/37*100)/100 + 0.01;

可以看到37这个常数是最终带入QRcode::png的size参数的计算核心。所以接口接入像素后,按公式算出size即可。

但实际上,这个37算下来的size呢,并不精确。这个时候参考了下娄同学修改的代码,发现他的计算公式就更直接了:

floatval($size/38.97)

用38.97的常数计算得到的size,确实最终生成的图像像素和预期保持了一致。

问题到此就解决了,但是你不好奇这个38.97是怎么来的吗?我反正是有点好奇的,遂跟到代码里,看到最终位于QRimage的png方法调用参数如下:

public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE)

pixelPerPoint,翻译下就是每点像素。

继续跟进,进入到私有方法:

private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) 

查找这个变量的调用:

$target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);
ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);

然后发现这个pixelPerPoint 就是决定最终图片像素的一个常量。

这常量咋来的呢?我问了娄同学,答复如下:

先传4,5,6,7,8
用尺子测量实际的px数目
然后计算拟合曲线
其实是直线
得到一个比较准确的参数
就是一次函数,小学问题

我除了能喊666来表达敬佩之情,还真想不到其他了。牛逼。

Related Posts: PHP QR code生成指定像素的二维码方式 :

avatar