在画布中添加二维码加文字 和 压缩多图片到一个压缩包中
一、在画布中添加二维码加文字
<?php
class Image{
/** * 生成水印图片 图片结合底部文字 * @param string $file
* @param string $code
* @return array
*/
public function getPicture($file = '', $text = '',$date = '')
{
try {
$info = getimagesize($file); //获取图片信息
$type = image_type_to_extension($info[2], false); // 获取图片扩展名
$fun = "imagecreatefrom{$type}"; // 构建处理图片方法名-关键是这里
$image = $fun($file); // 调用方法处理
$font = public_path('/font/Century-Gothic.ttf'); // 字体文件
$color = imagecolorallocate($image, 0, 0, 0); // 文字颜色
$text = mb_convert_encoding($text, "html-entities", "utf-8");
//获取文字宽度及高度
$bounds = ImageTTFBBox(40, 0, $font, $text);
$min_x = min(array($bounds[0], $bounds[2], $bounds[4], $bounds[6]));
$max_x = max(array($bounds[0], $bounds[2], $bounds[4], $bounds[6]));
$min_y = min(array($bounds[1], $bounds[3], $bounds[5], $bounds[7]));
$max_y = max(array($bounds[1], $bounds[3], $bounds[5], $bounds[7]));
$width = ($max_x - $min_x);
$height = ($max_y - $min_y);
$image_thumb = imagecreatetruecolor($info[0], $info[1] + $height); //创建画布
$background = imagecolorallocate($image_thumb, 255, 255, 255); //白色
imagefill($image_thumb, 0, 0, $background); //填充背景颜色
//把二维码嵌入画布中
imagecopyresampled($image_thumb, $image, 0, 0, 0, 0, $info[0],
$info[1], $info[0], $info[1]);
//添加文字
imagettftext($image_thumb, 40, 0, ($info[0] - $width) / 2, 5 + $info[1]
+ $height / 2, $color, $font, $text);
// header("Content-Type:" . $info['mime']);
$imageTypeFun = "image" . $type;
$dir = public_path('/uploads/qr/picture/'.$date);
if(!is_dir($dir)){
@mkdir($dir,0777,true);
}
$src = $dir.'/'.$text . '.' . $type;
//保存
$path = '/uploads/qr/picture/'.$date .'/'. $text . '.' . $type;
$imageTypeFun($image_thumb, $src);
imagedestroy($background);
ob_end_clean();
return jsonReturn(0, '添加文字成功', $path);
} catch (\Exception $e) {
return jsonReturn(-1, $e->getMessage());
}
}
public function erweima($device){
require_once 'mobile/example/phpqrcode/phpqrcode.php';
$device_sn = $device;
$urls =$_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['SERVER_NAME
$url = $urls."/Mobile/index.html?device_sn=".$device_sn;
$url = urldecode($url);
$qr_code_path = 'uploads/QRcodeDevice/'.date("Y-m-d").'/';
if (!file_exists($qr_code_path)) {
mkdir($qr_code_path);
}
/* 生成二维码 */
$qr_code_file = $qr_code_path.$device_sn.'.png';
\QRcode::png($url, $qr_code_file, 'H', 6,6);//最后一个6是控制白边大小
$background = "mobile/font/back.png";
$logo = "mobile/font/logo.png";
$this->mark_photo($qr_code_file,$device_sn,$logo,$qr_code_file);
$where = array('device_sn'=>$device);
$arr['QRcode'] = $urls."/".$qr_code_file;
return $arr;
}
//拼接图片,logo,文字
private function mark_photo($background,$text,$logo,$filename){
$info = getimagesize($background); // 获取图片信息
$type = image_type_to_extension($info[2],false); // 获取图片扩展名
$fun = "imagecreatefrom{$type}"; // 构建处理图片方法名-关键是这里
$back= $fun($background); // 调用方法处理
$color=imagecolorallocate($back,0,0,0);
$logo_info = getimagesize($logo);
$logo_type = image_type_to_extension($info[2],false); // 获取图片扩展名
$logo_fun = "imagecreatefrom{$logo_type}"; // 构建处理图片方法名-关键是这里
$logo_w=$info[0];
$logo_h=$info[1];
$font="mobile/font/STYH.otf"; // 字体文件
//imagettftext只认utf8字体,所以用iconv转换
imagettftext($back, 21, 0, 40, 337, $color, $font, $text);//调二维码中字体位置
//执行合成调整位置
imagecopyresampled($back, $logo, 139,140, 0, 0, 65, 65, $logo_w, $logo_h);//调中间logo位置
$image_fun = 'image'.$type;
$image_fun($back,$filename);//保存
imagedestroy($back);
imagedestroy($logo);
return json_encode('code'=>0,'msg'=>'成功',array('filename'=>$filename));
}
/**
*压缩文件
* @return mixed
*/
public function getZipper()
{
$zip = new \ZipArchive();
// 图片路径
$img_path = public_path('/uploads/qr');
$img_files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($img_path));
$path = public_path('/uploads/download');
if(!file_exists($path)){
mkdir($path,0777,true);
}
$zip_file = $path.'/download.zip';
$zip->open($zip_file, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
$this->forZip($zip, $img_files, $img_path, '');
$zip->close();
return response()->download($zip_file);
}
//循环文件 添加压缩包中
private function forZip($zip, $files, $file_path, $new_path)
{
foreach ($files as $name => $file) {
// 我们要跳过所有子目录
if ( ! $file->isDir()) {
$filePath = $file->getRealPath();
// 用 substr/strlen 获取文件名
$relativePath = $new_path . substr($filePath, strlen($file_path));
$zip->addFile($filePath, $relativePath);
}
}
}
}