php 抓取网页生成图片(基于的二维码不上传到服务器页面的实现过程及应用)

优采云 发布时间: 2022-01-06 20:11

  php 抓取网页生成图片(基于的二维码不上传到服务器页面的实现过程及应用)

  一、背景

  要求是后台点击生成二维码,然后不上传二维码到服务器。我们需要将二维码返回首页并显示出来。

  二、实现过程

  1、生成二维码

  这里使用的第三方是二维码。网上百度有很多教程,这里就不赘述了。可以参考链接生成二维码

  函数索引($ctx){

  require_once APP_PATH.'/classes/phpqrcode/phpqrcode.php';

  $link_url="";

  $level="L";

  $size=6;

  ob_start();

  $QRcode = new QRcode();

  $QRcode->png($link_url,false,$level,$size,2);

  记录器::信息(base64_encode(ob_get_contents()));

  $imageString =base64_encode(ob_get_contents());

  记录器::信息($imageString);

  ob_end_clean();

  如果(ob_end_clean()){

  logger::info('end clen');

  }

  $数据=数组(

  '代码'=> 2,

  '二维码'=>$imageString

  );

  header("content-type:application/json; charset=utf-8");

  !!!(上面这行代码肯定有,因为Qrcode::png(),在生成二维码的时候,内部把响应的响应类型改为image/jpeg,所以需要自己手动设置响应头类型,否则接口不能返回json数据)

  返回 $data;

  }

  现在要实现的效果是通过接口将二维码路径返回给前端。

  这里需要明确的是,png() 方法返回的是一个二进制图像流。所以直接返回是没用的。如果我们打印返回值,我们会发现返回值为空。所以这里使用ob_start()来执行一系列使用缓冲区的操作。

  将二维码路径返回给前端。

  这里需要明确的是,png() 方法返回的是一个二进制图像流。所以直接返回是没用的。如果我们打印返回值,我们会发现返回值为空。所以这里使用ob_start()来执行一系列使用缓冲区的操作

  1. 第一个参数$text就是上面代码中的URL参数。

  2. 第二个参数$outfile默认为No,不生成文件,只返回二维码图片,否则需要生成生成的二维码图片的存放路径

  3. 第三个参数$level默认为L,这个参数可以传递的值为L(QR_ECLEVEL_L, 7%), M(QR_ECLEVEL_M, 15%), Q(QR_ECLEVEL_Q, 25%), H(QR_ECLEVEL_H, 30%)。该参数控制二维码的容错率,不同的参数表示二维码可以覆盖的面积百分比。利用二维码的容错率,我们可以将头像放置在生成的二维码图片的任意区域。

  4. 第四个参数$size,控制生成图片的大小,默认为4

  5. 第五个参数 $margin 控制生成二维码的空白区域的大小

  6. 第六个参数$saveandprint,保存二维码图片并显示,$outfile必须传递图片路径。

  第二个参数默认为false,该方法返回一个二进制图像流。当页面输出时,缓冲区中生成的内容将从缓冲区发送到浏览器。所以在代码中,日志输出没有记录在日志中,内容输出也不需要使用echo。所以直接用base64_encode(QRcode::png)是没用的。

  这里使用 ob_start() 方法打开输出缓冲区。所有输出信息都不会直接发送到浏览器,而是存储在输出缓冲区中。这里是将生成的图片流从buffer中保存到内存对象中,使用base64_encode将其转为编码后的字符串,通过json返回给页面。

  php缓存区相关的操作函数如下。

  一、 相关功能介绍:

  1、Flush:刷新缓冲区的内容并输出。

  函数格式:flush()

  说明:这个功能经常用到,效率很高。

  2、ob_start:打开输出缓冲区

  函数格式:void ob_start(void)

  注意:当缓冲区被激活时,所有来自 PHP 程序的非文件头信息都不会被发送,而是存储在内部缓冲区中。为了输出缓冲区的内容,可以使用ob_end_flush() 或flush() 来输出缓冲区的内容。

  3. ob_get_contents:返回内部缓冲区的内容。

  如何使用:字符串 ob_get_contents(void)

  说明:该函数将返回当前缓冲区的内容,如果输出缓冲区未激活,则返回FALSE。

  4、ob_get_length:返回内部缓冲区的长度。

  使用方法:int ob_get_length(void)

  说明:该函数将返回当前缓冲区的长度;像 ob_get_contents,如果输出缓冲区没有被激活。它返回 FALSE。

  5、ob_end_flush:将内部缓冲区的内容发送到浏览器,并关闭输出缓冲区。

  使用方法:void ob_end_flush(void)

  说明:该函数发送输出缓冲区的内容(如果有)。

  6、ob_end_clean:删除内部缓冲区的内容并关闭内部缓冲区

  使用方法:void ob_end_clean(void)

  说明:该函数不会输出内部缓冲区的内容,而是将其删除!

  7、ob_implicit_flush:开启或关闭绝对刷新

  使用方法:void ob_implicit_flush([int flag])

  注意:任何使用过 Perl 的人都知道 $|=x 的含义。该字符串可以打开/关闭缓冲区,ob_implicit_flush 函数与此相同。默认是关闭缓冲区。开启绝对输出后,每次脚本输出都是直接发送到浏览器,不需要调用flush()

  原链接。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线