请问该怎么做才能将文字说明和二维码一起作为png图片一起下载

请问该怎么做才能将文字说明和二维码一起作为png图片一起下载?在二维码中添加文字又会被二维码遮挡调整文字距离后超过二维码距离又不显示文字
在前端页面的显示

img


作为图片下载后的图片样式

img

html>
<html lang="en">
<head>
  <title>工位信息填报title> 
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="../css/QRcode.css">
head>
<body>
  
body>
html>

    // 连接MySQL数据库
    $con=mysqli_connect("localhost","root","zsc%1234","textplain");
    if (!$con) {
      echo "连接数据库失败";
    }
    // 准备查询语句
    $sql = "SELECT * FROM station";
    // 执行查询语句
    $result = mysqli_query($con, $sql);
    // 获取查询结果
    $employee_list = mysqli_fetch_all($result, MYSQLI_ASSOC);
    // 输出JSON格式的员工列表
    //echo json_encode($employee_list);
    // 循环获取员工信息并生成二维码
    foreach ($employee_list as $employee) {
      // 构建二维码字符串
      if($employee['userName']&&$employee['workOrder']){
          $qr_url="http://localhost/myWEB/stationManagementSystem/html/getinformation.php?statioNum=".urlencode($employee['statioNum'])."&bulid=".urlencode($employee['bulid'])."&floor=".urlencode($employee['floor'])."&userName=".urlencode($employee['userName'])."&workOrder=".urlencode($employee['workOrder']);
      }else{
          $qr_url="http://localhost/myWEB/stationManagementSystem/html/getinformation.php?statioNum=".urlencode($employee['statioNum'])."&bulid=".urlencode($employee['bulid'])."&floor=".urlencode($employee['floor']);
      }
      // 输出二维码容器
      echo '
'; // 输出二维码图片和工位位置的文字说明 echo '
$employee['statioNum'] . '">
'
; echo '
' . $employee['statioNum'] . '
'
; // 引入 QRCodejs2 和 FileSaver.js echo ''; echo ''; // 生成二维码并保存为文件 echo ''; echo '
'
; } // 关闭数据库连接 mysqli_close($con); ?>

如果你要实现二维码加文字说明转为图片的话,使用canvas里绘画文字的方式不好实现的。Github上有一个叫html2canvas的库,它可以将一个div绘画成canvas,因此你可以使用qrcode、html2canvas 进行了封装,将二维码和绘制为canvas的div整合为一个canvas。
关键代码:

/**
        * 将两个canvas合并在一起
        * 
        * @param {Object} dom canvas要添加的dom对象
        * @param {Object} canvas1 第一个canvas
        * @param {Object} canvas2 第二个canvas
        * @param {Number} padding 图片的padding,默认20
        * @return {String} 返回base64字符串
        *  
        */
        function concatCanvas(dom,canvas1,canvas2,padding){
            var c1h = canvas1.height,
                c1w = canvas1.width,

                c2h = Number(canvas2.style.height.slice(0,-2));
                c2w = Number(canvas2.style.width.slice(0,-2));
                canvas = document.createElement("canvas");
                padding = padding || 20 ;
            /** 根据二维码、文字两个canvas,再加上padding计算出新的canvas的宽度和高度 **/
            canvas.height = c1h + c2h + 2.5 * padding ;
            canvas.width = Math.max(c1w,c2w) + 2 * padding ;
            /** end **/
            dom.appendChild(canvas);
            /** 将canvas画上白色背景 **/
            context = canvas.getContext("2d");
            context.fillStyle ="white";
            context.fillRect(0,0,canvas.width,canvas.height);
            /** end **/
            /** 将二维码、文字两个canvas绘画到一个canvas里 **/
            context.drawImage(canvas1, padding, padding, c1w ,c1h);
            context.drawImage(canvas2, padding, 1.5 * padding+c1h, c2w ,c2h);
            /** end **/
            /** 返回base64,用于注入到a标签里以便下载 **/
            return canvas.toDataURL('image/jpeg',1);
            /** end **/
        }

详细的代码,建议您看下这个资料:https://juejin.cn/post/6844903556265295880

参考GPT:要将文字说明和二维码放在同一张PNG图片上,以下是PHP GD库中的图像处理函数实现的代码:

// 连接MySQL数据库
$con=mysqli_connect("localhost","root","zsc%1234","textplain");
if (!$con) {
  echo "连接数据库失败";
}
// 准备查询语句
$sql = "SELECT * FROM station";
// 执行查询语句
$result = mysqli_query($con, $sql);
// 获取查询结果
$employee_list = mysqli_fetch_all($result, MYSQLI_ASSOC);
// 关闭数据库连接
mysqli_close($con);

// 创建背景图
$background = imagecreatefrompng('background.png');
$color = imagecolorallocate($background, 0, 0, 0);
// 循环获取员工信息并生成二维码
foreach ($employee_list as $employee) {
  // 构建二维码字符串
  if($employee['userName']&&$employee['workOrder']){
      $qr_url="http://localhost/myWEB/stationManagementSystem/html/getinformation.php?statioNum=".urlencode($employee['statioNum'])."&bulid=".urlencode($employee['bulid'])."&floor=".urlencode($employee['floor'])."&userName=".urlencode($employee['userName'])."&workOrder=".urlencode($employee['workOrder']);
  }else{
      $qr_url="http://localhost/myWEB/stationManagementSystem/html/getinformation.php?statioNum=".urlencode($employee['statioNum'])."&bulid=".urlencode($employee['bulid'])."&floor=".urlencode($employee['floor']);
  }
  // 生成二维码
  $qrcode = new QRCode($qr_url);
  $qrcode_image = $qrcode->getImage(8);
  // 在背景图上绘制二维码
  imagecopy($background, $qrcode_image, 50, 50, 0, 0, imagesx($qrcode_image), imagesy($qrcode_image));
  // 绘制工位位置的文字说明
  imagettftext($background, 14, 0, 50, 300, $color, 'arial.ttf', $employee['statioNum']);
}
// 输出图像
header('Content-Type: image/png');
imagepng($background);
// 保存为文件
imagepng($background, 'output.png');
// 销毁图像
imagedestroy($background);


其中,background.png是背景图片,arial.ttf是字体文件。你需要将它们放到代码所在的目录下。

你可以根据实际需要调整二维码和文字说明的位置和大小,以及选择合适的字体和颜色。

该回答引用于gpt与OKX安生共同编写:
  • 该回答引用于gpt与OKX安生共同编写:

您可以使用html2canvas和jsPDF这两个库,html2canvas可以将页面的内容转为canvas,包括二维码和文字,然后使用jsPDF生成一个pdf文件,最后将pdf文件转为png图片即可下载。

下面是一个示例代码:

首先在html中添加一个按钮:

<button id="download-btn">下载图片</button>

然后在js中添加以下代码:



// 获取下载按钮
var downloadBtn = document.getElementById('download-btn');

// 监听下载按钮的点击事件
downloadBtn.addEventListener('click', function() {
  // 将整个页面转成canvas
  html2canvas(document.body).then(function(canvas) {
    // 创建一个新的jsPDF对象
    var pdf = new jsPDF('p', 'mm', 'a4');

    // 将canvas添加为新的一页,并设置页面尺寸
    pdf.addImage(canvas.toDataURL('image/png'), 'PNG', 0, 0, 210, 297);

    // 保存为pdf文件
    pdf.save('test.pdf');

    // 将pdf文件转成png图片
    var imgData = pdf.output('datauristring');
    var img = new Image();
    img.src = imgData;

    // 创建一个下载链接
    var link = document.createElement('a');
    link.download = 'test.png';
    link.href = img.src;

    // 触发下载动作
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
  });
});

在上述代码中,我们首先使用html2canvas将整个页面转成canvas,然后创建一个新的jsPDF对象,并将canvas添加为新的一页。接着使用pdf.save方法将pdf文件保存在本地,最后将pdf转成png图片并将其下载。

注意:在使用html2canvas时,由于跨域问题可能会导致无法转为canvas,需要额外处理。

通过Css样式控制二维码图片和文字的位置,下载的时候使用html2canvas将页面元素序列成图片是不是可行

先画个空白的图 把二维码放上去,然后在把文字也绘制到这个空白图片的最下面