前期准備
- 引入phpqrcode類庫(下載地址:https://sourceforge.net/projects/phpqrcode/)
- 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 = 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();
(注:很多參考網上現有的資料,如果有錯誤,歡迎留言指正!)
