Fork me on GitHub

PHP GD库合成图片

引入phpqrcode,并结合php提供的类库gd进行图片合成

安装GD库

  1. 终端内运行php -m,可以查看到是否安装gd库
  2. 安装gd库
    apt-get install php5-gd #ubuntu
    yum install php5-gd #centos

代码

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
<?php
/**
* @desc: generate qrcode
*/
define("QRCODE_PATH", dirname(__FILE__));
include 'phpqrcode/qrlib.php';
//download zip file
//download($zipName);

generate_qr('123456');

function generate_qr($str){
$font = QRCODE_PATH.'/hwxh.ttf';
$num = str_pad($str, '6', '0', STR_PAD_LEFT);
$txt = '收 银 台 : ' .trim(preg_replace('/(\d)/', '$1 ', $num));
$url = 'https://example.com/' . $num; //二维码内容
$qrcode = "/tmp/{$num}_qr.png";

$level = 'L';//容错级别
$size = 10;//生成图片大小
QRcode::png($url, $qrcode, $level, $size, 2);

//二维码宽/高度
$qrcode = imagecreatefrompng($qrcode);
$qrcode_w = imagesx($qrcode);
$qrcode_h = imagesy($qrcode);

$bg_w = 768; // 背景图片宽度
$bg_h = 800; // 背景图片高度

$bg_img = imagecreatetruecolor($bg_w, $bg_h);
$white = imagecolorallocate($bg_img, 255, 255, 255);
imagefill($bg_img, 0, 0, $white);

imagecopyresampled($bg_img, $qrcode, 15, -10, 0, 0, 740, 740, $qrcode_w, $qrcode_h);

$black = imagecolorallocate($bg_img, 0, 0, 0);
$fontsize = 28;
$fontbox = imagettfbbox($fontsize, 0, $font, $txt);
imagettftext($bg_img, $fontsize, 0, ceil(($bg_w - $fontbox[2])/2), $bg_w + 5, $black, $font, $txt);

$qr = "/tmp/qr_$num.png";
imagepng($bg_img, $qr);
imagedestroy($qrcode);
imagedestroy($bg_img);

$fp = fopen($qr, 'rb', 0);
/**
* 修改图片分辨率
*/
$base64= 'data:image/png;base64,'.base64_encode(fread($fp, filesize($qr)));
$file = file_get_contents($base64);
$filename = "$num.png";

//数据块长度为9
$len = pack("N", 9);
//数据块类型标志为pHYs
$sign = pack("A*", "pHYs");
//X方向和Y方向的分辨率均为300DPI(1像素/英寸=39.37像素/米),单位为米(0为未知,1为米)
$data = pack("NNC", 300 * 39.37, 300 * 39.37, 0x01);
//CRC检验码由数据块符号和数据域计算得到
$checksum = pack("N", crc32($sign . $data));
$phys = $len . $sign . $data . $checksum;

$pos = strpos($file, "pHYs");
if ($pos > 0) {
//修改pHYs数据块
$file = substr_replace($file, $phys, $pos - 4, 21);
} else {
//IHDR结束位置(PNG头固定长度为8,IHDR固定长度为25)
$pos = 33;
//将pHYs数据块插入到IHDR之后
$file = substr_replace($file, $phys, $pos, 0);
}
file_put_contents(QRCODE_PATH."/images/$filename", $file);
//header("Content-type: image/png");
//header('Content-Disposition: attachment; filename="' . $filename . '"');

unlink("/tmp/{$num}_qr.png");
unlink("/tmp/qr_$num.png");
// echo $file;
}

function download($zipName){
//实例化zipArchive类
$zip = new zipArchive();
if(!$zip->open($zipName, ZIPARCHIVE::CREATE)){
exit('不能下载');
} //打开的方式来进行创建 若有则打开 若没有则进行创建
//循环将要下载的文件路径添加到压缩包
$files = glob(QRCODE_PATH.'/images/*');
foreach ($files as $file) {
if(file_exists($file)){
$zip->addFile($file, basename($file));
}
}
//关闭压缩包
$zip->close();
// //实现文件的下载
// header('Content-Type:Application/zip');
// header('Content-Disposition:attachment; filename="' . basename($zipName) . '"');
// header('Content-Length:' . filesize($zipName));
// readfile($zipName);
// //删除生成的压缩文件
// unlink($zipName);
}

运行结果:
Example

参考资料
phpqrcode
字体下载

轻轻的我走了,正如我轻轻的来