[转] PHP开发通用型标题图片功能

WordPress 、 DedeCMS 等知名的网站内容管理系统(CMS)发布内容时都支持缩略图,基本操作就是在数据表中设计一个 thumb 字段用于保存缩略图的地址,今天说说如何设计出后台通用的标题图片(缩略图)功能 。

网站前台缩略图的展示没什么好说的,做个简单的 if (thumb) { ... } 就 OK  了 。

首先在数据库设计的时候记得新建一个 thumb 字段,这是必须的基本操作 。

比如【爱玩电脑】网站中“电脑技术”和“硬件导购”栏目都使用到了标题图片功能,所以必须开发成通用型功能,现在我们把接口文件定为 admin/thumb.php 。

在内容的发布页我们使用 iframe 框架到 thumb.php , 并提供“使用网络图片地址”和“上传本地图片”两种方法 , 如下图所示 :

我们可建立一个隐藏的 DIV 容器并将 iframe 框架放在里面,比如
<div class="hide" id="thumbBox"><iframe src="thumb.php"></iframe></div>

在调用该框架页面 thumb.php 时,应在父页面中设置好表单元素 。

图片中可以看到 name="thumbInput" 的隐藏表单元素,它的作用就是将图片地址跟着表单数据一起提交至服务器处理程序中,比如 contnet.php?action=add_post  。

到这里我们不禁要问 iframe 中上传的图片地址如何同步 thumbInput 值呢?其实到这里我们还只是解决了标题图片的地址问题,如果图片尺寸、形状、大小不合适呢? 所以我们还需要进行剪切,剪切好了再同步 thumbInput 值 。

标题图片 Thumb 的剪切

标题图片地址调用成功后,需要进行剪切调整大小、形状,我使用一款名为 jcrop 的 jQuery 插件,大家可以通过百度获取,或者戳这里下载 jcrop 插件  。

jcrop 功能还是很强大的,关键是兼容性挺不错,具体大家可以查看说明,给个图片大家预览预览 ,官方给出的演示比较全面,建议大家那看效果和文档 。

jcrop 插件功能预览

上传完成(or 调用图片地址)后我们将页面跳转到 thumb.php?action=croper 剪切页面,在调用缩略图接口页面 thumb.php 时我们带上 channel 参数例如 thumb.php?channel=daogou ,并将这个 channel 参数传递下去,在剪切时提供不同的剪切模板以保存不同尺寸的标题图片 。

尼玛网速太慢,这两图片上传半天,差点超时 han.gif 先保存一下  !

我们接着说标题图片的剪切和 jcrop 的使用,看代码截图 :

网速太快,图片已上天 ...

 

<div class="container" role="main">
	<div class="row">
		<form id="cropForm">
			<input type="hidden" name="isUpload" value="1" />

			<input type="hidden" name="x" id="x" value="0" />
			<input type="hidden" name="y" id="y" value="0" />
			<input type="hidden" name="w" id="w" value="0" />
			<input type="hidden" name="h" id="h" value="0" />

			<input type="hidden" name="tw" value="230">
			<input type="hidden" name="th" value="230">

			<input type="hidden" name="img" id="img" value="<?php echo $data['url']; ?>" />
			<button type="button" id="btnCrop" class="btn btn-primary" οnclick="crop()">剪裁图片</button>
			<button type="button" id="btnSkipCrop" class="btn btn-default" οnclick="skip_crop()">跳过剪裁</button>
		</form>
	</div>

	<div class="row" style="height: 30px">&nbsp;</div>

	<div class="row">
		<img id="element_id" src="<?php echo $data['url']; ?>">
	</div>

</div>

还是直接贴代码吧,接着看下面

 

 

<script>
var SI = $('#element_id') // 源图片
var TI = $('#thumbImg', window.parent.document) // 父框架中的预览图

$('#element_id').Jcrop({
	onSelect: updateCoords,
	minSize: [100, 100],
	aspectRatio: 1 / 1,
	boxWidth: 580,
	boxHeight: 300
})

function updateCoords(c){
	$('#x').val(c.x)
	$('#y').val(c.y)
	$('#w').val(c.w)
	$('#h').val(c.h)

	var rx = 100 / c.w
	var ry = 100 / c.h

	var sw = SI.width()
	var sh = SI.height()

	TI.attr('src', '<?php echo $data['url']; ?>')
	TI.css({
		width: Math.round(rx * sw) + 'px',
		height: Math.round(ry * sh) + 'px',
		marginLeft: '-' + Math.round(rx * c.x) + 'px',
		marginTop: '-' + Math.round(ry * c.y) + 'px'
	})
}

function crop(){
	$.ajax({
		//dataType : 'json',
		dataType : 'html',
		type : 'post',
		url : '<?php echo SYS_DIR . PRIVATE_DIR; ?>/thumb.php?action=crop_post',
		data : $('#cropForm').serialize(),
		error : function(){
			alert('AJAX 请求错误')
		},
		beforeSend : function(){
			$('#btnCrop').button('loading')
		},
		success : function(data){
			alert(data)
			if (data.error==1){
				alert(data.message)
			} else {
				$('#thumbInput', window.parent.document).val(data.message)
				$('#myModal', window.parent.document).hide()
				$('#thumbIframe', window.parent.document).attr('src', '<?php echo SYS_DIR . PRIVATE_DIR; ?>/thumb.php?action=upload')
			}
		},
		complete : function(){
			$('#btnCrop').button('reset')
		}
	})
}

function skip_crop(){
	$.ajax({
		dataType : 'json',
		type : 'post',
		url : '<?php echo SYS_DIR . PRIVATE_DIR; ?>/thumb.php?action=skip_crop',
		data : $('#cropForm').serialize(),
		error : function(){
			alert('AJAX 请求错误')
		},
		beforeSend : function(){
			$('#btnSkipCrop').button('loading')
		},
		success : function(data){
			if (data.error==1){
				alert(data.message)
			} else {
				TI.attr('src', data.message)
				$('#thumbInput', window.parent.document).val(data.message)
				$('#myModal', window.parent.document).hide()
				$('#thumbIframe', window.parent.document).attr('src', '<?php echo SYS_DIR . PRIVATE_DIR; ?>/thumb.php')
			}
		},
		complete : function(){
			$('#btnSkipCrop').button('reset')
		}
	})
}
</script>

javascript 部分,主要提供标题图片的预览、表单数据的更新、还有个跳过剪切的功能 。

其中标题图片的预览是在父页面的这个位置 , 当然这是我随便截取的一张图片 。

当数据提交至 thumb.php?action=crop_post 后,接着看下面的处理 ...

 

case 'crop_post':
	$x = post('x', 1);
	$y = post('y', 1);
	$w = post('w', 1);
	$h = post('h', 1);
	$img = post('img');
	$isUpload = post('isUpload');

	$tw = post('tw', 1);
	$th = post('th');

	if (!filter_var($img, FILTER_VALIDATE_URL))
	{
		echo json_encode(array(error=>1, message=>'图片地址错误'));
		exit();
	}

	if ($w < 50 || $h < 50)
	{
		echo json_encode(array(error=>1, message=>'选区尺寸太小请重新选择'));
		exit();
	}

	if (!$tw || !$th)
	{
		echo json_encode(array(error=>1, message=>'图片存储尺寸获取失败'));
		exit();
	}

	# image.class.php 依赖 imageIck
	$image = loader('image'); 
	$image->open($img); # 打开图片
	$image->crop($x, $y, $w, $h, $tw, $th); # x1、y1、选区宽度、选区高度、存储宽度、存储高度

	$path = $image->save(); # sae/tmp_45089/13534.gif

	if (!$path)
	{
		echo json_encode(array(error=>1, message=>'保存图片错误 SAE_TMP_PATH'));
		exit();
	}

	$attached = loader('attached');
	$attached->channel = 'thumb';
	
	$array = $attached->write(true, $path); # write(is_path, $data or path, $new_path)

	//如果$img存在删除冗余图片
	if ($isUpload)
	{
		$path = str_replace(ATTACHED_HOST . '/', '', $img);
		$attached->delete($path);
	}
	
	echo json_encode($array);
	break;

@hange 代码写得丑,大家不要见笑 , 像我这种业余选手代码能跑起来就差不多了 。

 

主要就是获取图片中选区的起始位置,选区大小,目标图片大小等参数,生成并保存图片后就可以把新图片的地址同步至父页面中的 thumbInput 表单元素 。

转载于:https://my.oschina.net/4ever/blog/692691

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值