//下载图片保存到本地
public static function curl_file_get_contents($url,$path){
$hander = curl_init();
$fp = fopen($path,'wb');
curl_setopt($hander,CURLOPT_URL,$url);
curl_setopt($hander,CURLOPT_FILE,$fp);
curl_setopt($hander,CURLOPT_HEADER,0);
curl_setopt($hander,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($hander,CURLOPT_TIMEOUT,60);
curl_exec($hander);
curl_close($hander);
fclose($fp);
Return $path;
}
//对本地图片进行base64位转码
public static function base64EncodeImage ($imageFile) {
$base64Image='';
$imageInfo = getimagesize($imageFile);
$imageData = fread(fopen($imageFile, 'r'), filesize($imageFile));
$base64Image = 'data:' . $imageInfo['mime'] . ';base64,' .chunk_split(base64_encode($imageData));
return $base64Image;
}
创建一个新的图片处理类
namespace App\Http\tool;
class ImgCompress
{
private $src;
private $image;
private $imageinfo;
private $percent = 0.5;
/*
* 图片压缩
* @param $src 源图
* @param float $percent 压缩比例
*/
public function __construct($src, $percent = 0.8)
{
$this->src = $src;
$this->percent = $percent;
}
/** 高清压缩图片
* @param string $saveName 提供图片名(可不带扩展名,用源图扩展名)用于保存。或不提供文件名直接显示
*/
public function compressImg($saveName = '')
{
$this->_openImage();
if (!empty($saveName)) $this->_saveImage($saveName); //保存
else $this->_showImage();
}
/**
* 内部:打开图片
*/
private function _openImage()
{
list($width, $height, $type, $attr) = getimagesize($this->src);
$this->imageinfo = array(
'width' => $width,
'height' => $height,
'type' => image_type_to_extension($type, false),
'attr' => $attr
);
$fun = "imagecreatefrom" . $this->imageinfo['type'];
$this->image = $fun($this->src);
$this->_thumpImage();
}
/**
* 内部:操作图片
*/
private function _thumpImage()
{
$new_width = $this->imageinfo['width'] * $this->percent;
$new_height = $this->imageinfo['height'] * $this->percent;
$image_thump = imagecreatetruecolor($new_width, $new_height);
//将原图复制带图片载体上面,并且按照一定比例压缩,极大的保持了清晰度
imagecopyresampled($image_thump, $this->image, 0, 0, 0, 0, $new_width, $new_height, $this->imageinfo['width'], $this->imageinfo['height']);
imagedestroy($this->image);
$this->image = $image_thump;
}
/**
* 输出图片:保存图片则用saveImage()
*/
private function _showImage()
{
header('Content-Type: image/' . $this->imageinfo['type']);
$funcs = "image" . $this->imageinfo['type'];
$funcs($this->image);
}
/**
* 保存图片到硬盘:
* @param string $dstImgName 1、可指定字符串不带后缀的名称,使用源图扩展名 。2、直接指定目标图片名带扩展名。
*/
private function _saveImage($dstImgName)
{
if (empty($dstImgName)) return false;
$allowImgs = ['.jpg', '.jpeg', '.png', '.bmp', '.wbmp', '.gif']; //如果目标图片名有后缀就用目标图片扩展名 后缀,如果没有,则用源图的扩展名
$dstExt = strrchr($dstImgName, ".");
$sourseExt = strrchr($this->src, ".");
if (!empty($dstExt)) $dstExt = strtolower($dstExt);
if (!empty($sourseExt)) $sourseExt = strtolower($sourseExt);
//有指定目标名扩展名
if (!empty($dstExt) && in_array($dstExt, $allowImgs)) {
$dstName = $dstImgName;
} elseif (!empty($sourseExt) && in_array($sourseExt, $allowImgs)) {
$dstName = $dstImgName . $sourseExt;
} else {
$dstName = $dstImgName . $this->imageinfo['type'];
}
$funcs = "image" . $this->imageinfo['type'];
$funcs($this->image, $dstName);
}
/**
* 销毁图片
*/
public function __destruct()
{
imagedestroy($this->image);
}
调用 对应方法
$res=Helper::curl_file_get_contents($url,'test1.jpg'); //$url 为图片路径
$dst_img = 'text.jpg';//压缩后图片的名称
(new ImgCompress($res,self::PERCENT))->compressImg($dst_img); //这里的self::PERCENT 是定义的常亮 即 压缩比例 默认不传为 0.5,数据在 0-1 之间
$base64=Helper::base64EncodeImage($dst_img);
unlink($res); //删除本地图片
unlink($dst_img); //删除本地图片
return $base64;
添加一个方法
//base64位 转图片
public static function base64ToImage($base64_image_content){
// 正则匹配 img类型
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
$type = $result[2];
$new_file = "test.{$type}";
if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){
return $new_file;
}else{
return false;
}
}
}
然后调方法:
$img=Helper::base64ToImage($base64); //传入你的base64 编码
$dst_img = 'text.jpg';//压缩后图片的名称
(new ImgCompress($img,self::PERCENT))->compressImg($dst_img); //这里的self::PERCENT 是定义的常量 即 压缩比例 默认不传为 0.5,数据在 0-1 之间
$newBase64=Helper::base64EncodeImage($dst_img);
unlink($img); //删除本地图片
unlink($dst_img); //删除本地图片
return $newBase64;
很多都是前人踩过坑,借鉴了他们的代码(找不到原作者,如有侵权,请联系删除)