最近做微信开放平台开发,产品提了一个需求就是获取每个小程序得二维码和预览二维码。微信提供了接口获取小程序得预览二维码和二维码,但是在什么时候获取呢?
在小程序绑定小程序得时候就PUT一个mesage到消息队列去,然后回调一个方法来修改小程序绑定情况和小程序的二维码和预览二维码。现在知道在哪儿获取了,开始想得是在回调函数里面把获取得图片上传到七牛,老大说服务器尽量不要做上传,因为上传流量很小。最后使用将图片使用PHP函数转换成base64.
还好PHP提供了一个函数(base64_encode)直接将图片转换成base64,然后我实验了一下转换倒是转换成功了,可是太慢了而且MYSQL字段为text没有存储下,这下就得把图片压缩了再base64。
记得之前使用GD库坐过缩略图,不过忘记咋过得了^ ^,于是就百度资料,大部分资料都说的是直接打开文件资源然后再创建一个文件资源把打开的文件资源copy到创建得文件资源里面,不过我试验了一下失败了,因为微信得二维码URL里面没有后缀,而是二进制文件,然后心里面默默得骂了一句TMD,辛亏PHP提供了imagecreatefromstring
这个函数(由于粗心大意没仔细看文档失败了几次);终于把微信返回得二维码转换成图片了,再使用imagecreatetruecolor
创建新的文件流。最后imagecopyresized
将原资源copy到创建得文件资源里面。
现在已经得到了需要得文件资源了,怎么存入数据库呢,实验了几次失败了,最后找到了PHP内置函数获取资源库OB。
最终代码如下:
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2017/11/28
* Time: 11:50
*
* 生成图片缩略图
* 获取到从微信那边拿到的二维码,由于太大了所以就得压缩一下二维码
* 在微信那边拿到的就只能是二进制,所以使用GD库转换成图片资源,再就行压缩base64存入数据库
*/
namespace App\Controllers\Tool;
class ImageController{
protected $_oldImg = null;
protected $_info;
protected static $_instance = null;
public static function instance()
{
if( is_null( self::$_instance ) ){
self::$_instance = new self();
}
return self::$_instance;
}
/**
* 初始化
*
* @param string $url
* @return ImageController
*/
public function init( $url ){
$content = file_get_contents( $url );
$this->_oldImg = imagecreatefromstring( $content );
$this->_info = getimagesizefromstring( $content );
return $this;
}
/**
* 要生产图片得长度和宽度
*
* @param int $width 生成图片得宽度
* @param int $height 生成图片得高度
* @return string
*/
public function getImage($width, $height){
// 获取原始数据
list($src_w, $src_h) = $this->_info;
ob_start();
$img = imagecreatetruecolor($width, $height);
imagecopyresized( $img, $this->_oldImg, 0, 0, 0, 0, $width, $height, $src_w, $src_h);
imagejpeg($img);
$content = ob_get_contents();
ob_end_clean();
$this->destroy( $img );
$this->destroy( $this->_oldImg );
$data = 'data:image/png;base64,' . base64_encode( $content );
return $data;
}
/**
* 销毁资源
*
* @param source $source
*/
public function destroy( $source ){
imagedestroy( $source );
}
}
总结:又熟悉了OB和GD,网上说ImageMagick这个扩展挺好玩的,这次没有机会实践,改天可以实践玩玩