先上结果 :二维码加上logo,并logo不失真

实现:
用composer添加扩展phpqrcode
引用
use PHPQRCode\QRcode;
代码:
/*** 生成二维码
@param str $text 生成二维码的内容
@param str $path 保存路径 ==false 只显示,不保存到本地路径
@param str $level = "L"; // 容错级别 level 控制二维码容错率,默认为L,范围:L、M、Q、H
@param number $size = 10; // 生成图片大小
@param number $margin = 2; // 边距
@param str $saveandprint = false //不明:qrcode.php生成所需
@param str $logo 设置显示在二维码中间的图地址
@param number $from_width 二维码的偏移
参考文档 https://blog.csdn.net/s371795639/article/details/53518724
*****/
public function createQrcode($param = []){
if(empty($param['text'])){
return false;
}
$text = $param['text'];
$path = $param['path'] ? App::getRootPath().$param['path'] : false;
$level = $param['level'] ?: 'L';
$size = $param['size'] ?: 3;
$margin = $param['margin'] ?: 4;
$saveandprint = $param['saveandprint'] ?: false;
$logo = $param['logo'];
//设置中间图
$logo_qr_width = $param['logo_qr_width']?:5;
$from_width = $param['from_width'] ?: 2;
$qrcode = new QRcode();
$qrcode->png($text, $path, $level, $size, $margin, $saveandprint);
if(empty($logo)){
exit;
}
//判断是否有中间图
$QR = $path; //已经生成的原始二维码图
if(file_exists(@$logo) && $path !== false){
$QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
$logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
$QR_width = imagesx($QR);
$QR_height = imagesy($QR);
$logo_width = imagesx($logo);
$logo_height = imagesy($logo);
$logo_qr_width = $QR_width / $logo_qr_width; //$QR_width / 5;
$scale = $logo_width / $logo_qr_width;
$logo_qr_height = $logo_height / $scale;
$from_width = ($QR_width - $logo_qr_width) / $from_width; // / 2;
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
imagepng($QR, $path);
@header("Content-type: image/png");
imagepng($QR);
imagedestroy($QR);
imagedestroy($logo);
die; // tp5里输出图片在最后必须die掉,否则会输出图片二进制流
}
}调用
//创建二维码
public function createqr(){
$code = 5855451;
$data = [
'text'=>'https://www.bilibili.com/video/av10360081',
'path'=>'public/uploads/qrcode/'.$code.'.png',
'level'=>'Q',
'size'=>6,
'margin'=>1,
//'logo'=> App::getRootPath().'public/uploads/avatar/oXAn10DtGNKDz421q_ATefmwAgrI.jpg',
'logo'=> App::getRootPath().'public/uploads/qrcode/logo1.png',
'logo_qr_width' => 3,
];
Utils::createQrcode($data);
}结果:

出现了问题:
中间的logo失真特别厉害
解决方法
public function createQrcode($param = []){
if(empty($param['text'])){
return false;
}
$text = $param['text'];
$path = $param['path'] ? App::getRootPath().$param['path'] : false;
$level = $param['level'] ?: 'L';
$size = $param['size'] ?: 3;
$margin = $param['margin'] ?: 4;
$saveandprint = $param['saveandprint'] ?: false;
$logo = $param['logo'];
//设置中间图
$logo_qr_width = $param['logo_qr_width']?:5;
$from_width = $param['from_width'] ?: 2;
$qrcode = new QRcode();
$qrcode->png($text, $path, $level, $size, $margin, $saveandprint);
if(empty($logo)){
exit;
}
//判断是否有中间图
$QR = $path; //已经生成的原始二维码图
if(file_exists(@$logo) && $path !== false){
$QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
$logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
if (imageistruecolor($logo)) { //添加
imagetruecolortopalette($logo, false, 65535);//添加这行代码来解决颜色失真问题
}
$QR_width = imagesx($QR);
$QR_height = imagesy($QR);
$logo_width = imagesx($logo);
$logo_height = imagesy($logo);
$logo_qr_width = $QR_width / $logo_qr_width; //$QR_width / 5;
$scale = $logo_width / $logo_qr_width;
$logo_qr_height = $logo_height / $scale;
$from_width = ($QR_width - $logo_qr_width) / $from_width; // / 2;
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
imagepng($QR, $path);
@header("Content-type: image/png");
imagepng($QR);
imagedestroy($QR);
imagedestroy($logo);
die; // tp5里输出图片在最后必须die掉,否则会输出图片二进制流
}
}结果:

解决了logo失真的问题
参考文档:https://blog.csdn.net/s371795639/article/details/53518724
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号