PHP批量生成底部帶編號二維碼(二維碼生成+文字生成圖片+圖片拼接合並)

PHP批量生成帶底部編號二維碼(二維碼生成+文字生成圖片+圖片拼接合並)php

需求:git

輸入編號如 : cb05-0000001  至 cb05-0000500 批量生成 以編號爲名稱的下圖二維碼,而後壓縮並下載github

 思路: phpqrcode 生成 二維碼  -->  編號字符串生成圖片 ---> 二維碼與編號圖片拼接---->壓縮 下載數組

1  PHP生成二維碼  app

下載並加載phpqrcode.php,本次需批量生成二維碼,屢次調用此函數,注意 include_once函數

//生成二維碼圖片
    public function makeCodeImg($url, $product_sn = '2018**82019') {$path = 'upload/product_qr_code'; if (!is_dir($path)) { mkdir($path, 0777, true); } include_once 'phpqrcode/phpqrcode.php'; $value = $url;                  //二維碼內容
        $errorCorrectionLevel = 'L';    //容錯級別
        $matrixPointSize = 12;           //生成圖片大小

        $filename = $path . '/' . $product_sn . '.jpg'; QRcode::png($value, $filename, $errorCorrectionLevel, $matrixPointSize, 2); $QR = $filename;                //已經生成的原始二維碼圖片文件
        $QR = imagecreatefromstring(file_get_contents($QR)); imagejpeg($QR, $product_sn . 'jpg'); }

 

2 編號字符串生成圖片 文字居中(注意字體文件下載與選擇)字體

若 文字爲中文 字體選擇不當會出現 小方框替代了文字this

//文字生成圖片
    public function makeImgWithStr($filename, $text, $font_size=20,$font = 'font/Arial/Arial.ttf') { //圖片尺寸
        $im = imagecreatetruecolor(444, 70); //背景色
        $white = imagecolorallocate($im, 255, 255, 255); //字體顏色
        $black = imagecolorallocate($im, 0, 0, 0); imagefilledrectangle($im, 0, 0, 444, 300, $white); $txt_max_width = intval(0.8 * 444); $content = ""; for ($i = 0; $i < mb_strlen($text); $i++) { $letter[] = mb_substr($text, $i, 1); } foreach ($letter as $l) { $test_str = $content . " " . $l; $test_box = imagettfbbox($font_size, 0, $font, $test_str); // 判斷拼接後的字符串是否超過預設的寬度。超出寬度添加換行
            if (($test_box[2] > $txt_max_width) && ($content !== "")) { $content .= "\n"; } $content .= $l; } $txt_width = $test_box[2] - $test_box[0]; $y = 70 * 0.5; // 文字從何處的高度開始
        $x = (444 - $txt_width) / 2; //文字居中 // echo $x;die; //文字寫入
        imagettftext($im, $font_size, 0, $x, $y, $black, $font, $content); //寫 TTF 文字到圖中 //圖片保存
        imagejpeg($im, $filename); }

 

3 合併拼接二維碼與文字圖片(豎直拼接保證等寬,橫向拼接保證等高)url

  /** * 合併圖片,拼接合並 * @param array $image_path 須要合成的圖片數組 * @param $save_path 合成後圖片保存路徑 * @param string $axis 合成方向 * @param string $save_type 合成後圖片保存類型 * @return bool|array */
    public function CompositeImage(array $image_path, $save_path, $axis = 'y', $save_type = 'png') { if (count($image_path) < 2) { return false; } //定義一個圖片對象數組
        $image_obj = []; //獲取圖片信息
        $width = 0; $height = 0; foreach ($image_path as $k => $v) { $pic_info = getimagesize($v); list($mime, $type) = explode('/', $pic_info['mime']); //獲取寬高度
            $width += $pic_info[0]; $height += $pic_info[1]; if ($type == 'jpeg') { $image_obj[] = imagecreatefromjpeg($v); } elseif ($type == 'png') { $image_obj[] = imagecreatefrompng($v); } else { $image_obj[] = imagecreatefromgif($v); } } //按軸生成畫布方向
        if ($axis == 'x') { //TODO X軸無縫合成時請保證全部圖片高度相同
            $img = imageCreatetruecolor($width, imagesy($image_obj[0])); } else { //TODO Y軸無縫合成時請保證全部圖片寬度相同
            $img = imageCreatetruecolor(imagesx($image_obj[0]), $height); } //建立畫布顏色
        $color = imagecolorallocate($img, 255, 255, 255); imagefill($image_obj[0], 0, 0, $color); //建立畫布
        imageColorTransparent($img, $color); imagecopyresampled($img, $image_obj[0], 0, 0, 0, 0, imagesx($image_obj[0]), imagesy($image_obj[0]), imagesx($image_obj[0]), imagesy($image_obj[0])); $yx = imagesx($image_obj[0]); $x = 0; $yy = imagesy($image_obj[0]); $y = 0; //循環生成圖片
        for ($i = 1; $i <= count($image_obj) - 1; $i++) { if ($axis == 'x') { $x = $x + $yx; imagecopymerge($img, $image_obj[$i], $x, 0, 0, 0, imagesx($image_obj[$i]), imagesy($image_obj[$i]), 100); } else { $y = $y + $yy; imagecopymerge($img, $image_obj[$i], 0, $y, 0, 0, imagesx($image_obj[$i]), imagesy($image_obj[$i]), 100); } } //設置合成後圖片保存類型
        if ($save_type == 'png') { imagepng($img, $save_path); } elseif ($save_type == 'jpg' || $save_type == 'jpeg') { imagejpeg($img, $save_path); } else { imagegif($img, $save_path); } return true; }

 

圖片等寬處理參考(等高處理相似)spa

public function ImgCompress($src, $out_with = 150) { // 獲取圖片基本信息
        list($width, $height, $type, $attr) = getimagesize($src); // 獲取圖片後綴名
        $pic_type = image_type_to_extension($type, false); // 拼接方法
        $imagecreatefrom = "imagecreatefrom" . $pic_type; // 打開傳入的圖片
        $in_pic = $imagecreatefrom($src); // 壓縮後的圖片長寬
        $new_width = $out_with; $new_height = $out_with / $width * $height; // 生成中間圖片
        $temp = imagecreatetruecolor($new_width, $new_height); // 圖片按比例合併在一塊兒。
        imagecopyresampled($temp, $in_pic, 0, 0, 0, 0, $new_width, $new_height, $width, $height); // 銷燬輸入圖片
        imagejpeg($temp, 'upload/merge' . time() . ".jpg"); imagedestroy($in_pic); return array($temp, $new_width, $new_height); }

 

5 壓縮合並與下載

//生成帶編號說明的二維碼 (生成二維碼 文字生成圖片 圖片合併拼接)
    public function makeMergerImg($sn_product){ $this->makeCodeImg('dev2.lystrong.cn',$sn_product); $this->makeImgWithStr('upload/sn_str_img/'.$sn_product.'.jpg',$sn_product,30); $this->CompositeImage(['upload/product_qr_code/'.$sn_product.'.jpg','upload/sn_str_img/'.$sn_product.'.jpg'],'upload/pin_code/'.$sn_product.'.png'); unlink('upload/sn_str_img/'.$sn_product.'.jpg'); unlink('upload/product_qr_code/'.$sn_product.'.jpg'); }   //生成壓縮zip文件 $file_name 最終生成的文件名,包含路徑 $file_list,用來生成file_name的文件數組
  public function makeZip($file_name, $file_list) { if (file_exists($file_name)) { unlink($file_name); } //從新生成文件
        $zip = new ZipArchive(); if ($zip->open($file_name, ZIPARCHIVE::CREATE) !== TRUE) { exit('沒法打開文件,或者文件建立失敗'); } foreach ($file_list as $val) { if (file_exists($val)) { $zip->addFile($val); } } $zip->close();//關閉
        if (!file_exists($file_name)) { exit('沒法找到文件'); //即便建立,仍有可能失敗
 } }   //下載
    public function download($file){ if ( file_exists ( $file )) { header ( 'Content-Description: File Transfer' ); header ( 'Content-Type: application/octet-stream' ); header ( 'Content-Disposition: attachment; filename=' . basename ( $file )); header ( 'Content-Transfer-Encoding: binary' ); header ( 'Expires: 0' ); header ( 'Cache-Control: must-revalidate' ); header ( 'Pragma: public' ); header ( 'Content-Length: ' . filesize ( $file )); ob_clean (); flush (); readfile ( $file ); exit; } }

驗證調用:

$product_str_start = 'cb05-00000155'; $product_str_end = 'cb05-00000160'; $press = explode('-',$product_str_start)[0]; $product_sn_start = explode('-',$product_str_start)[1]; $product_sn_end = explode('-',$product_str_end)[1]; $count = $product_sn_end - $product_sn_start; for ($i=0;$i<=$count;$i++){ $product_sn = $press.'-'.substr($product_sn_start+$i+1000000,1,7); $Img->makeMergerImg($product_sn); $img_arr[$i] = 'upload/pin_code/'.$product_sn.'.png'; } $Img->makeZip('upload/pin_code-0007.zip',$img_arr); $Img->download('upload/pin_code-0007.zip');

   

 

完整代碼:https://github.com/wanggang826/php-do-image

相關文章
相關標籤/搜索