この記事では、サイズの設定、ロゴの追加、ストローク、角丸、透明度などの処理をサポートする QR コード クラスを作成する PHP 実装を紹介します。誰もが学習して使用できるように、完全なコード、デモンストレーションの例、詳細なパラメーターの説明が提供されています。
機能は次のとおりです。
1. QR コードを作成します。
2. QR コードにロゴを追加します。ストローク
4. ロゴの角を丸めることができます##5。ロゴの透明度は、png、jpg、gif形式をサポートします##7。出力画像の品質を設定できます
設定パラメータの説明:
QR コードの品質 L-最小、M、Q , H-best
size
dest_file
品質
ロゴ
logo_size
logo_outline_size
logo_outline_color
logo_opacity
logo_radius
コードは次のとおりです:
PHPQRCode.class.php
<?phprequire_once dirname(__FILE__)."/qrcode/qrlib.php";/**
* PHP创建二维码类
* Date: 2018-03-18
* Author: fdipzone
* Version: 1.0
*
* Description:
* PHP实现创建二维码类,支持设置尺寸,加入LOGO,圆角,透明度,等处理。
*
* Func:
* public set_config 设定配置
* public generate 创建二维码
* private create_qrcode 创建纯二维码图片
* private add_logo 合拼纯二维码图片与logo图片
* private image_outline 图片对象进行描边
* private image_fillet 图片对象进行圆角处理
* private imagecopymerge_alpha 合拼图片并保留各自透明度
* private create_dirs 创建目录
* private hex2rgb hex颜色转rgb颜色
* private get_file_ext 获取图片类型
*/class PHPQRCode{ // class start
/** 默认设定 */
private $_config = array( 'ecc' => 'H', // 二维码质量 L-smallest, M, Q, H-best
'size' => 15, // 二维码尺寸 1-50
'dest_file' => 'qrcode.png', // 创建的二维码路径
'quality' => 100, // 图片质量
'logo' => '', // logo路径,为空表示没有logo
'logo_size' => null, // logo尺寸,null表示按二维码尺寸比例自动计算
'logo_outline_size' => null, // logo描边尺寸,null表示按logo尺寸按比例自动计算
'logo_outline_color' => '#FFFFFF', // logo描边颜色
'logo_opacity' => 100, // logo不透明度 0-100
'logo_radius' => 0, // logo圆角角度 0-30
); /**
* 设定配置
* @param Array $config 配置内容
*/
public function set_config($config){
// 允许设定的配置
$config_keys = array_keys($this->_config); // 获取传入的配置,写入设定
foreach($config_keys as $k=>$v){ if(isset($config[$v])){ $this->_config[$v] = $config[$v];
}
}
} /**
* 创建二维码
* @param String $data 二维码内容
* @return String
*/
public function generate($data){
// 创建临时二维码图片
$tmp_qrcode_file = $this->create_qrcode($data); // 合拼临时二维码图片与logo图片
$this->add_logo($tmp_qrcode_file); // 删除临时二维码图片
if($tmp_qrcode_file!='' && file_exists($tmp_qrcode_file)){
unlink($tmp_qrcode_file);
} return file_exists($this->_config['dest_file'])? $this->_config['dest_file'] : '';
} /**
* 创建临时二维码图片
* @param String $data 二维码内容
* @return String
*/
private function create_qrcode($data){
// 临时二维码图片
$tmp_qrcode_file = dirname(__FILE__).'/tmp_qrcode_'.time().mt_rand(100,999).'.png'; // 创建临时二维码
QRcode::png($data, $tmp_qrcode_file, $this->_config['ecc'], $this->_config['size'], 2); // 返回临时二维码路径
return file_exists($tmp_qrcode_file)? $tmp_qrcode_file : '';
} /**
* 合拼临时二维码图片与logo图片
* @param String $tmp_qrcode_file 临时二维码图片
*/
private function add_logo($tmp_qrcode_file){
// 创建目标文件夹
$this->create_dirs(dirname($this->_config['dest_file'])); // 获取目标图片的类型
$dest_ext = $this->get_file_ext($this->_config['dest_file']); // 需要加入logo
if(file_exists($this->_config['logo'])){ // 创建临时二维码图片对象
$tmp_qrcode_img = imagecreatefrompng($tmp_qrcode_file); // 获取临时二维码图片尺寸
list($qrcode_w, $qrcode_h, $qrcode_type) = getimagesize($tmp_qrcode_file); // 获取logo图片尺寸及类型
list($logo_w, $logo_h, $logo_type) = getimagesize($this->_config['logo']); // 创建logo图片对象
switch($logo_type){
case 1: $logo_img = imagecreatefromgif($this->_config['logo']); break;
case 2: $logo_img = imagecreatefromjpeg($this->_config['logo']); break;
case 3: $logo_img = imagecreatefrompng($this->_config['logo']); break;
default: return '';
} // 设定logo图片合拼尺寸,没有设定则按比例自动计算
$new_logo_w = isset($this->_config['logo_size'])? $this->_config['logo_size'] : (int)($qrcode_w/5); $new_logo_h = isset($this->_config['logo_size'])? $this->_config['logo_size'] : (int)($qrcode_h/5); // 按设定尺寸调整logo图片
$new_logo_img = imagecreatetruecolor($new_logo_w, $new_logo_h);
imagecopyresampled($new_logo_img, $logo_img, 0, 0, 0, 0, $new_logo_w, $new_logo_h, $logo_w, $logo_h); // 判断是否需要描边
if(!isset($this->_config['logo_outline_size']) || $this->_config['logo_outline_size']>0){ list($new_logo_img, $new_logo_w, $new_logo_h) = $this->image_outline($new_logo_img);
} // 判断是否需要圆角处理
if($this->_config['logo_radius']>0){ $new_logo_img = $this->image_fillet($new_logo_img);
} // 合拼logo与临时二维码
$pos_x = ($qrcode_w-$new_logo_w)/2; $pos_y = ($qrcode_h-$new_logo_h)/2;
imagealphablending($tmp_qrcode_img, true); // 合拼图片并保留各自透明度
$dest_img = $this->imagecopymerge_alpha($tmp_qrcode_img, $new_logo_img, $pos_x, $pos_y, 0, 0, $new_logo_w, $new_logo_h, $this->_config['logo_opacity']); // 生成图片
switch($dest_ext){ case 1: imagegif($dest_img, $this->_config['dest_file'], $this->_config['quality']); break; case 2: imagejpeg($dest_img, $this->_config['dest_file'], $this->_config['quality']); break; case 3: imagepng($dest_img, $this->_config['dest_file'], (int)(($this->_config['quality']-1)/10)); break;
}
// 不需要加入logo
}else{ $dest_img = imagecreatefrompng($tmp_qrcode_file); // 生成图片
switch($dest_ext){ case 1: imagegif($dest_img, $this->_config['dest_file'], $this->_config['quality']); break; case 2: imagejpeg($dest_img, $this->_config['dest_file'], $this->_config['quality']); break; case 3: imagepng($dest_img, $this->_config['dest_file'], (int)(($this->_config['quality']-1)/10)); break;
}
}
} /**
* 对图片对象进行描边
* @param Obj $img 图片对象
* @return Array
*/
private function image_outline($img){
// 获取图片宽高
$img_w = imagesx($img); $img_h = imagesy($img); // 计算描边尺寸,没有设定则按比例自动计算
$bg_w = isset($this->_config['logo_outline_size'])? intval($img_w + $this->_config['logo_outline_size']) : $img_w + (int)($img_w/5); $bg_h = isset($this->_config['logo_outline_size'])? intval($img_h + $this->_config['logo_outline_size']) : $img_h + (int)($img_h/5); // 创建底图对象
$bg_img = imagecreatetruecolor($bg_w, $bg_h); // 设置底图颜色
$rgb = $this->hex2rgb($this->_config['logo_outline_color']); $bgcolor = imagecolorallocate($bg_img, $rgb['r'], $rgb['g'], $rgb['b']); // 填充底图颜色
imagefill($bg_img, 0, 0, $bgcolor); // 合拼图片与底图,实现描边效果
imagecopy($bg_img, $img, (int)(($bg_w-$img_w)/2), (int)(($bg_h-$img_h)/2), 0, 0, $img_w, $img_h); $img = $bg_img; return array($img, $bg_w, $bg_h);
} /**
* 对图片对象进行圆角处理
* @param Obj $img 图片对象
* @return Obj
*/
private function image_fillet($img){
// 获取图片宽高
$img_w = imagesx($img); $img_h = imagesy($img); // 创建圆角图片对象
$new_img = imagecreatetruecolor($img_w, $img_h); // 保存透明通道
imagesavealpha($new_img, true); // 填充圆角图片
$bg = imagecolorallocatealpha($new_img, 255, 255, 255, 127);
imagefill($new_img, 0, 0, $bg); // 圆角半径
$r = $this->_config['logo_radius']; // 执行圆角处理
for($x=0; $x<$img_w; $x++){ for($y=0; $y<$img_h; $y++){ $rgb = imagecolorat($img, $x, $y); // 不在图片四角范围,直接画图
if(($x>=$r && $x<=($img_w-$r)) || ($y>=$r && $y<=($img_h-$r))){
imagesetpixel($new_img, $x, $y, $rgb); // 在图片四角范围,选择画图
}else{ // 上左
$ox = $r; // 圆心x坐标
$oy = $r; // 圆心y坐标
if( ( ($x-$ox)*($x-$ox) + ($y-$oy)*($y-$oy) ) <= ($r*$r) ){
imagesetpixel($new_img, $x, $y, $rgb);
} // 上右
$ox = $img_w-$r; // 圆心x坐标
$oy = $r; // 圆心y坐标
if( ( ($x-$ox)*($x-$ox) + ($y-$oy)*($y-$oy) ) <= ($r*$r) ){
imagesetpixel($new_img, $x, $y, $rgb);
} // 下左
$ox = $r; // 圆心x坐标
$oy = $img_h-$r; // 圆心y坐标
if( ( ($x-$ox)*($x-$ox) + ($y-$oy)*($y-$oy) ) <= ($r*$r) ){
imagesetpixel($new_img, $x, $y, $rgb);
} // 下右
$ox = $img_w-$r; // 圆心x坐标
$oy = $img_h-$r; // 圆心y坐标
if( ( ($x-$ox)*($x-$ox) + ($y-$oy)*($y-$oy) ) <= ($r*$r) ){
imagesetpixel($new_img, $x, $y, $rgb);
}
}
}
} return $new_img;
} // 合拼图片并保留各自透明度
private function imagecopymerge_alpha($dest_img, $src_img, $pos_x, $pos_y, $src_x, $src_y, $src_w, $src_h, $opacity){
$w = imagesx($src_img); $h = imagesy($src_img); $tmp_img = imagecreatetruecolor($src_w, $src_h);
imagecopy($tmp_img, $dest_img, 0, 0, $pos_x, $pos_y, $src_w, $src_h);
imagecopy($tmp_img, $src_img, 0, 0, $src_x, $src_y, $src_w, $src_h);
imagecopymerge($dest_img, $tmp_img, $pos_x, $pos_y, $src_x, $src_y, $src_w, $src_h, $opacity); return $dest_img;
} /**
* 创建目录
* @param String $path
* @return Boolean
*/
private function create_dirs($path){
if(!is_dir($path)){ return mkdir($path, 0777, true);
} return true;
} /** hex颜色转rgb颜色
* @param String $color hex颜色
* @return Array
*/
private function hex2rgb($hexcolor){
$color = str_replace('#', '', $hexcolor); if (strlen($color) > 3) { $rgb = array( 'r' => hexdec(substr($color, 0, 2)), 'g' => hexdec(substr($color, 2, 2)), 'b' => hexdec(substr($color, 4, 2))
);
} else { $r = substr($color, 0, 1) . substr($color, 0, 1); $g = substr($color, 1, 1) . substr($color, 1, 1); $b = substr($color, 2, 1) . substr($color, 2, 1); $rgb = array( 'r' => hexdec($r), 'g' => hexdec($g), 'b' => hexdec($b)
);
} return $rgb;
} /** 获取图片类型
* @param String $file 图片路径
* @return int
*/
private function get_file_ext($file){
$filename = basename($file); list($name, $ext)= explode('.', $filename); $ext_type = 0; switch(strtolower($ext)){ case 'jpg': case 'jpeg': $ext_type = 2; break; case 'gif': $ext_type = 1; break; case 'png': $ext_type = 3; break;
} return $ext_type;
}
} // class end?>
demo.php
<?phprequire 'PHPQRCode.class.php';$config = array( 'ecc' => 'H', // L-smallest, M, Q, H-best
'size' => 12, // 1-50
'dest_file' => 'qrcode.png', 'quality' => 90, 'logo' => 'logo.jpg', 'logo_size' => 100, 'logo_outline_size' => 20, 'logo_outline_color' => '#FFFF00', 'logo_radius' => 15, 'logo_opacity' => 100,
);// 二维码内容$data = 'http://weibo.com/fdipzone';// 创建二维码类$oPHPQRCode = new PHPQRCode();// 设定配置$oPHPQRCode->set_config($config);// 创建二维码$qrcode = $oPHPQRCode->generate($data);// 显示二维码echo '<img src="/static/imghwm/default1.png" data-src="'.$qrcode.'?t='.time().'" class="lazy" alt="PHPを介してロゴ付きのQRコードクラスを作成する方法" >';?>
生成された QR コード画像:
この記事では、PHP を使用してロゴ付きの QR コード クラスを作成する方法について説明します。関連知識については、PHP 中国語 Web サイトを参照してください。 関連する推奨事項:
php json_encode についてオブジェクトはサポートしていません プライベート属性の説明
#PHP が生成する固有の RequestID クラスに関する内容の説明
#
以上がPHPを介してロゴ付きのQRコードクラスを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPにより、インタラクティブなWebコンテンツを簡単に作成できます。 1)HTMLを埋め込んでコンテンツを動的に生成し、ユーザー入力またはデータベースデータに基づいてリアルタイムで表示します。 2)プロセスフォームの提出と動的出力を生成して、XSSを防ぐためにHTMLSPECIALCHARSを使用していることを確認します。 3)MySQLを使用してユーザー登録システムを作成し、Password_HashおよびPreprocessingステートメントを使用してセキュリティを強化します。これらの手法を習得すると、Web開発の効率が向上します。

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ドリームウィーバー CS6
ビジュアル Web 開発ツール
