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来表达敬佩之情,还真想不到其他了。牛逼。
如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。
如本文对您有用,捐赠和留言 将是对我最好的支持~(捐赠可转为站内积分)
如愿意,请向朋友推荐本站,谢谢。
尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。
留言