前期準備
- 引入phpqrcode類別庫(下載地址:https://download.csdn.net/download/weixin_37557729/11891240;支持彩色二維碼的下載地址:https://download.csdn.net/download/weixin_37557729/11891244)
- PHP開啟GD擴展庫支持
1、利用phpqrcode生成二維碼:
原理分析:
下載下來的類檔案是一個壓縮包,包含很多檔案和演示程式,我們只需要里邊的phpqrcode.php
這一個檔案就可以生成二維碼了,它是一個多個類的集合檔案,我們需要用到里邊的QRcode類的png()方法:
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);
}
/**
*
* 引數詳解
* 第1個引數$text:二維碼包含的內容,可以是鏈接、文字、json字串等等;
* 第2個引數$outfile:默認為false,不生成檔案,只將二維碼圖片回傳輸出;否則需要給出存放生成二維碼圖片的檔案名及路徑;
* 第3個引數$level:容錯級別,默認為L,
* 可傳遞的值分別是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),
* 這個引數控制二維碼容錯率,不同的引數表示二維碼可被覆寫的區域百分比,也就是被覆寫的區域還能識別
* 第4個引數$size:控制生成圖片的大小,默認為4;
* 第5個引數$margin:控制生成二維碼的空白區域大小;
* 第6個引數$saveandprint:保存二維碼圖片并顯示出來,$outfile必須傳遞圖片路徑;
*
*/
使用示例:
require_once("./phpqrcode.php");
function creatQrcode(){
//設定二維碼的鏈接地址
$url = "http://www.baidu.com";
//設定二維碼的容錯級別
/*
* 容錯級別:容錯級別百分比越高,就越容易識別,容錯級別:
* 按照效果排序依次是 H -> Q -> M -> L
*/
$errorCorrectionLevel = 'H';
//設定生成二維碼圖片的大小
$matrixPointSize = 7;
//設定生成二維碼的圖片名稱(路徑名稱根據專案需求而定)
$filename = "test.png";
QRcode::png($url, $filename, $errorCorrectionLevel, $matrixPointSize, 1);
//以上已經生成了二維碼了(同級目錄下的test.png)
}
creatQrcode();
2、如果要在生成的二維碼中間放置logo的話:
<?php
//引入phpqrcode類別庫
require_once("./phpqrcode.php");
function creatQrcode(){
//設定二維碼的鏈接地址
$url = "http://www.baidu.com";
//設定二維碼的容錯級別
/*
* 容錯級別:容錯級別百分比越高,就越容易識別,容錯級別:
* 按照效果排序依次是 H -> Q -> M -> L
*/
$errorCorrectionLevel = 'H';
//設定生成二維碼圖片的大小
$matrixPointSize = 7;
//設定生成二維碼的圖片名稱
$filename = "test.png";
QRcode::png($url, $filename, $errorCorrectionLevel, $matrixPointSize, 1);
//以上已經生成了二維碼了(同級目錄下的test.png)
$logo = './img/logo.png';
$QR = $filename;
$QRlogo = './img/qrlogo.png';
if(file_exists($logo)){
// 函式:imagecreatefromstring():創建一塊畫布,并從字串中的影像流新建一副影像
$QR = imagecreatefromstring(file_get_contents($QR)); //目標圖象連接資源,
$logo = imagecreatefromstring(file_get_contents($logo)); //源圖象連接資源,
// php函式:imagesx(resource image):獲取影像寬度
// PHP函式:imagesy(resource image):獲取影像高度
$QR_width = imagesx($QR);
$QR_height = imagesy($QR);
$logo_width = imagesx($logo);//logo圖片寬度
$logo_height = imagesy($logo);//logo圖片高度
$logo_qr_width = $QR_width / 5; //組合之后logo的寬度(占二維碼的1/5)
$scale = $logo_width/$logo_qr_width; //logo的寬度縮放比(本身寬度/組合后的寬度)
$logo_qr_height = $logo_height/$scale; //組合之后logo的高度
$from_width = ($QR_width - $logo_qr_width) / 2; //組合之后logo左上角所在坐標點
//重新組合圖片,并調整大小
/**
* 函式 imagecopyresampled():將一幅影像中的一塊正方形區域拷貝到另一個影像中,平滑地插入像素值,因此,尤其是,減小了影像的大小而仍然保持了極大的清晰度,引數詳解
*
* bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
*
* dst_image 目標圖象連接資源,
* src_image 源圖象連接資源,
* dst_x 目標 X 坐標點,
* dst_y 目標 Y 坐標點,
* src_x 源的 X 坐標點,
* src_y 源的 Y 坐標點,
* dst_w 目標寬度,
* dst_h 目標高度,
* src_w 源圖象的寬度,
* src_h 源圖象的高度,
*/
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
// PHP函式:imagepng ( resource image [, string filename] ):以 PNG 格式將影像輸出到瀏覽器或檔案
imagepng($QR,$QRlogo);
echo '<image src="'.$QRlogo.'"/>';
}
}
creatQrcode();
3、如果加了logo的二維碼要放在一張海報上的話:
imagecopymerge函式制拼合(鑲嵌,合并)圖片 同樣適合水印之類的
<?php
//引入phpqrcode類別庫
require_once("./phpqrcode.php");
function creatQrcode(){
//設定二維碼的鏈接地址
$url = "http://www.baidu.com";
//設定二維碼的容錯級別
/*
* 容錯級別:容錯級別百分比越高,就越容易識別,容錯級別:
* 按照效果排序依次是 H -> Q -> M -> L
*/
$errorCorrectionLevel = 'H';
//設定生成二維碼圖片的大小
$matrixPointSize = 7;
//設定生成二維碼的圖片名稱
$filename = "test.png";
QRcode::png($url, $filename, $errorCorrectionLevel, $matrixPointSize, 1);
//以上已經生成了二維碼了(同級目錄下的test.png)
//————————————————————————————————————————————————————————————————
//二維碼上添加logo
$logo = './img/logo.png';
$QR = $filename;
$QRlogo = './img/qrlogo.png';
if(file_exists($logo)){
// 函式:imagecreatefromstring():創建一塊畫布,并從字串中的影像流新建一副影像
$QR = imagecreatefromstring(file_get_contents($QR)); //目標圖象連接資源,
$logo = imagecreatefromstring(file_get_contents($logo)); //源圖象連接資源,
// php函式:imagesx(resource image):獲取影像寬度
// PHP函式:imagesy(resource image):獲取影像高度
$QR_width = imagesx($QR);
$QR_height = imagesy($QR);
$logo_width = imagesx($logo);//logo圖片寬度
$logo_height = imagesy($logo);//logo圖片高度
$logo_qr_width = $QR_width / 5; //組合之后logo的寬度(占二維碼的1/5)
$scale = $logo_width/$logo_qr_width; //logo的寬度縮放比(本身寬度/組合后的寬度)
$logo_qr_height = $logo_height/$scale; //組合之后logo的高度
$from_width = ($QR_width - $logo_qr_width) / 2; //組合之后logo左上角所在坐標點
//重新組合圖片,并調整大小
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
// PHP函式:imagepng ( resource image [, string filename] ):以 PNG 格式將影像輸出到瀏覽器或檔案
imagepng($QR,$QRlogo);
//——————————————————————————————————————————
// 加了logo的二維碼放在海報之類的背景圖上面
$dst_path = './img/xuexi.jpg'; //底圖
$src_path = $QRlogo; //覆寫圖,我們就繼續用上面的那張圖QRlogo
//創建圖片實體
$dst = imagecreatefromstring(file_get_contents($dst_path));
$src = https://www.cnblogs.com/zmdComeOn/p/imagecreatefromstring(file_get_contents($src_path));
//獲取覆寫圖的寬高
list($src_w, $src_h) = getimagesize($src_path);
/**
*
* PHP函式:imagecopymerge()/imagecopy()
*
* bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
* 將 src_im 影像中坐標從 src_x,src_y 開始,寬度為 src_w,高度為 src_h 的一部分拷貝到 dst_im 影像中坐標為 dst_x 和 dst_y 的位置上,兩影像將根據 pct 來決定合并程度,其值范圍從 0 到 100,當 pct = 0 時,實際上什么也沒做,當為 100 時對于調色板影像本函式和 imagecopy() 完全一樣,它對真彩色影像實作了 alpha 透明,
*
*/
imagecopymerge($dst, $src, 20, 120, 0, 0, $src_w, $src_h, 100);
list($dst_w, $dst_h) = getimagesize($dst_path);
imagepng($dst,'./img/aaa.png');
imagedestroy($dst);
imagedestroy($src);
}
}
creatQrcode();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/131461.html
標籤:PHP
