编辑器上传图片至七牛,处理(裁剪,缩放)图片后上传,不落地

很多网站系统为了节省自身服务器空间,会将资源文件存储在第三方,这样很方面,只是存储空间需要收费的,如果用户上传过大图片会占用很多空间,然后显示也不需要调用原文件。
最近遇到一个关于这方面的问题,公司要求像素大于1000*1000的图片要进行裁剪,然后上传到七牛,像素超过1000的要裁剪为1000的,小于1000的直接上传原图。
看过七牛的文档,虽然有对大图片进行高级处理的v2版的说明,但是这些处理都是已经存储在七牛上的了。
看sdk中src/Qiniu/Storage/UploadManager.php中有put和putFile两个上传文件的方法,前者是上传 二进制流,后者是上传文件(原理也是转成 二进制)。
putFile:思路大概是降图片做完裁剪然后存放自身服务器上,然后将裁剪后的图片地址路径上传,上传成功后再将自身服务器上的资源删掉。我没有用这个方法,总觉得落地数据处理不舒服。
put:思路是将图片裁剪之后,将裁剪后的图片生成二进制流存放在缓存中,然后将缓存中的二进制调用put上传。

Talk is cheap. Show you the code。

裁剪图片,并返回裁剪后的图片二进制

/**
	 * 上传图片处理 原图像素大于1000*1000的处理
	 * $maxwidth = 1000
	 * $maxheight = 1000
	 */
	function resizeImage($im,$maxwidth=1000,$maxheight=1000){
		$pic_width = imagesx($im);
		$pic_height = imagesy($im);
		if(($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight)){
			if($maxwidth && $pic_width>$maxwidth){
				$widthratio = $maxwidth/$pic_width;
				$resizewidth_tag = true;
			}
			if($maxheight && $pic_height>$maxheight){
				$heightratio = $maxheight/$pic_height;
				$resizeheight_tag = true;
			}
			if($resizewidth_tag && $resizeheight_tag){
				if($widthratio<$heightratio){
					$ratio = $widthratio;
				}else{
					$ratio = $heightratio;
				}				
			}
			if($resizewidth_tag && !$resizeheight_tag)$ratio = $widthratio;
			if($resizeheight_tag && !$resizewidth_tag)$ratio = $heightratio;
			$newwidth = $pic_width * $ratio;
			$newheight = $pic_height * $ratio;
			if(function_exists("imagecopyresampled")){
				$newim = imagecreatetruecolor($newwidth,$newheight);
				imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
			}else{
				$newim = imagecreate($newwidth,$newheight);
				imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);
			}
			//不写入服务
			ob_start(); //开启缓存
			imagejpeg($newim);
			$erjinzhi = ob_get_clean(); //获取二进制
			return $erjinzhi; //返回二进制
		}else{ //像素没超过规定范围,返回原图二进制
			ob_start();
			imagejpeg($im);
			$erjinzhi = ob_get_clean();
			return $erjinzhi;
		}
	}
以下是调用七牛sdk上传二进制至服务器

$imageresource =  'J:\wamp\tmp\php8D3.tmp' ;//上传图片的临时文件或本地图片路径
$imgFile = $this->resizeImage($imageresource);//像素大于1000*1000的前期处理后上传
// 上传到七牛后保存的文件名
$time = md5(microtime().rand(1000,9999));
$name = substr($time, 0, 2) .'/'. substr($time, 2, 2) .'/'. $time;
$key = 'bbs/'.$name.'.jpg'; //上传后的文件命名
// 初始化 UploadManager 对象并进行文件的上传
$uploadMgr = new UploadManager();
// 调用 UploadManager 的 put 方法进行文件的上传
list($ret, $err) = $uploadMgr->put($token, $key, $imgFile);

以上是jpg静态图的上传方式,可根据传图属性分别使用imagejpeg() imagebmp() imagepng()不同方法。

如果gif上传也用以上方法的话,gif被裁剪后的结果只会保留gif的第一帧,也就是说裁剪后的gif是不会动的静态图,gif上传可直接使用七牛的UploadManager的putFile()直接上传。跳过裁剪过程。


你可能感兴趣的:(编辑器上传图片至七牛,处理(裁剪,缩放)图片后上传,不落地)