ホームページ > バックエンド開発 > PHPチュートリアル > PHPはロゴ付きのQRコードクラスを実装します

PHPはロゴ付きのQRコードクラスを実装します

小云云
リリース: 2023-03-22 10:48:01
オリジナル
2578 人が閲覧しました

この記事では、サイズの設定、ロゴの追加、ストローク、角丸、透明度などの処理をサポートするQRコードクラスを作成するphp実装を中心に紹介します。誰もが学習して使用できるように、完全なコード、デモンストレーションの例、詳細なパラメーターの説明が提供されています。 皆さんのお役に立てれば幸いです。

機能は次のとおりです:

1. QRコードを作成します
2. QRコードにロゴを追加できます
4. ロゴを丸めることができます
5.透明にする
6. 出力画像タイプは png、jpg、gif 形式をサポートします
7. 出力画像の品質を設定できます

設定パラメーターの説明:

ecc QR コードの品質 L-最小、 M、Q、H-best

サイズ QRコードサイズ1-50

dest_file 生成されたQRコード画像パス

品質 生成された画像品質

ロゴログo パス、空の意味ロゴを追加しません

logo_size

ロゴのサイズ、nullはQRコードのサイズに比例して自動的に計算されることを意味します

logo_outline_size

ロゴのストロークのサイズ、nullはロゴのサイズに比例して自動的に計算されることを意味します

logo_outline_color

ロゴのストロークの色

logo_opacity

ロゴの不透明度 0-100

logo_radius

ロゴの丸みの角度 0-30


コードは次のとおりです:

PHPQRCode .class.phpりー

demo.php

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

<?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(        &#39;ecc&#39; => &#39;H&#39;,                       // 二维码质量 L-smallest, M, Q, H-best

        &#39;size&#39; => 15,                       // 二维码尺寸 1-50

        &#39;dest_file&#39; => &#39;qrcode.png&#39;,        // 创建的二维码路径

        &#39;quality&#39; => 100,                    // 图片质量

        &#39;logo&#39; => &#39;&#39;,                       // logo路径,为空表示没有logo

        &#39;logo_size&#39; => null,                // logo尺寸,null表示按二维码尺寸比例自动计算

        &#39;logo_outline_size&#39; => null,        // logo描边尺寸,null表示按logo尺寸按比例自动计算

        &#39;logo_outline_color&#39; => &#39;#FFFFFF&#39;,  // logo描边颜色

        &#39;logo_opacity&#39; => 100,              // logo不透明度 0-100

        &#39;logo_radius&#39; => 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!=&#39;&#39; && file_exists($tmp_qrcode_file)){

            unlink($tmp_qrcode_file);

        }        return file_exists($this->_config[&#39;dest_file&#39;])? $this->_config[&#39;dest_file&#39;] : &#39;&#39;;

 

    }    /**

     * 创建临时二维码图片

     * @param  String $data 二维码内容

     * @return String

     */

    private function create_qrcode($data){

 

        // 临时二维码图片

        $tmp_qrcode_file = dirname(__FILE__).&#39;/tmp_qrcode_&#39;.time().mt_rand(100,999).&#39;.png&#39;;        // 创建临时二维码

        QRcode::png($data, $tmp_qrcode_file, $this->_config[&#39;ecc&#39;], $this->_config[&#39;size&#39;], 2);        // 返回临时二维码路径

        return file_exists($tmp_qrcode_file)? $tmp_qrcode_file : &#39;&#39;;

 

    }    /**

     * 合拼临时二维码图片与logo图片

     * @param String $tmp_qrcode_file 临时二维码图片

     */

    private function add_logo($tmp_qrcode_file){

 

        // 创建目标文件夹

        $this->create_dirs(dirname($this->_config[&#39;dest_file&#39;]));        // 获取目标图片的类型

        $dest_ext = $this->get_file_ext($this->_config[&#39;dest_file&#39;]);        // 需要加入logo

        if(file_exists($this->_config[&#39;logo&#39;])){            // 创建临时二维码图片对象

            $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[&#39;logo&#39;]);            // 创建logo图片对象

            switch($logo_type){ 

                case 1: $logo_img = imagecreatefromgif($this->_config[&#39;logo&#39;]); break

                case 2: $logo_img = imagecreatefromjpeg($this->_config[&#39;logo&#39;]); break

                case 3: $logo_img = imagecreatefrompng($this->_config[&#39;logo&#39;]); break

                default: return &#39;&#39;; 

            }            // 设定logo图片合拼尺寸,没有设定则按比例自动计算

            $new_logo_w = isset($this->_config[&#39;logo_size&#39;])? $this->_config[&#39;logo_size&#39;] : (int)($qrcode_w/5);            $new_logo_h = isset($this->_config[&#39;logo_size&#39;])? $this->_config[&#39;logo_size&#39;] : (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[&#39;logo_outline_size&#39;]) || $this->_config[&#39;logo_outline_size&#39;]>0){                list($new_logo_img, $new_logo_w, $new_logo_h) = $this->image_outline($new_logo_img);

            }            // 判断是否需要圆角处理

            if($this->_config[&#39;logo_radius&#39;]>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[&#39;logo_opacity&#39;]);            // 生成图片

            switch($dest_ext){                case 1: imagegif($dest_img, $this->_config[&#39;dest_file&#39;], $this->_config[&#39;quality&#39;]); break;                case 2: imagejpeg($dest_img, $this->_config[&#39;dest_file&#39;], $this->_config[&#39;quality&#39;]); break;                case 3: imagepng($dest_img, $this->_config[&#39;dest_file&#39;], (int)(($this->_config[&#39;quality&#39;]-1)/10)); break;

            }

 

        // 不需要加入logo

        }else{            $dest_img = imagecreatefrompng($tmp_qrcode_file);            // 生成图片

            switch($dest_ext){                case 1: imagegif($dest_img, $this->_config[&#39;dest_file&#39;], $this->_config[&#39;quality&#39;]); break;                case 2: imagejpeg($dest_img, $this->_config[&#39;dest_file&#39;], $this->_config[&#39;quality&#39;]); break;                case 3: imagepng($dest_img, $this->_config[&#39;dest_file&#39;], (int)(($this->_config[&#39;quality&#39;]-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[&#39;logo_outline_size&#39;])? intval($img_w + $this->_config[&#39;logo_outline_size&#39;]) : $img_w + (int)($img_w/5);        $bg_h = isset($this->_config[&#39;logo_outline_size&#39;])? intval($img_h + $this->_config[&#39;logo_outline_size&#39;]) : $img_h + (int)($img_h/5);        // 创建底图对象

        $bg_img = imagecreatetruecolor($bg_w, $bg_h);        // 设置底图颜色

        $rgb = $this->hex2rgb($this->_config[&#39;logo_outline_color&#39;]);        $bgcolor = imagecolorallocate($bg_img, $rgb[&#39;r&#39;], $rgb[&#39;g&#39;], $rgb[&#39;b&#39;]);        // 填充底图颜色

        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[&#39;logo_radius&#39;];        // 执行圆角处理

        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(&#39;#&#39;, &#39;&#39;, $hexcolor);        if (strlen($color) > 3) {            $rgb = array(                &#39;r&#39; => hexdec(substr($color, 0, 2)),                &#39;g&#39; => hexdec(substr($color, 2, 2)),                &#39;b&#39; => 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(                &#39;r&#39; => hexdec($r),                &#39;g&#39; => hexdec($g),                &#39;b&#39; => hexdec($b)

            );

        }        return $rgb;

    }    /** 获取图片类型

     * @param  String $file 图片路径

     * @return int

     */ 

    private function get_file_ext($file){

        $filename = basename($file);        list($name, $ext)= explode(&#39;.&#39;, $filename);        $ext_type = 0;        switch(strtolower($ext)){            case &#39;jpg&#39;:            case &#39;jpeg&#39;:                $ext_type = 2;                break;            case &#39;gif&#39;:                $ext_type = 1;                break;            case &#39;png&#39;:                $ext_type = 3;                break;

        }        return $ext_type;

    }

 

} // class end?>

ログイン後にコピー
関連する推奨事項:

(上級) phpでロゴ付きのQRコードを生成する方法のまとめ

以上がPHPはロゴ付きのQRコードクラスを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート