老张小站

  1. 欢迎光临

    感谢访问老张的博客!

  • 1
1,452

Discuz! X3 给缩略图加水印、保留无水印原图的方法

分类 网站技术/村民张先生 发布于 2020-01-11 20:00
0

达成效果

上传图片后,在保留原图的同时,给该图片生成带水印的缩略图和带水印的原尺寸图片各一张,一共三张图片。

这三张图片可根据不同的用户权限展示,例如缩略图供普通用户浏览(缩略图尺寸不宜过小,建议设为帖子正文宽度,720左右),而VIP会员可点击查看带水印的原尺寸图片,无水印原图可供收费下载。另外,由于缩略图一般开启了压缩,保留高质量原图可供日后使用,例如重新生成水印等。

基本条件

后台“全局-上传设置-论坛附件”中,“论坛帖子附件缩略图设置”处开启,“直接缩放原图”关闭(如果直接缩放原图,在下方保留原图代码执行前图片已经被缩放);
后台“全局-水印设置-论坛”中开启缩略图。

修改方法

注:本文代码中的“YUANTU”和“AAAA”可自定义,但须注意多处保持一致,且一旦确定不可再修改,否则将出错!

打开 source/function/function_post.php ,查找:

					$image->Watermark($_G['setting']['attachdir'].'/forum/'.$newattachfile[$aid], '', 'forum');

将其替换为:

					$opname = substr(md5('YUANTU'.$newattachfile[$aid].'AAAA'), 0, 8).'.'.array_pop(explode(".", $newattachfile[$aid])); rename($_G['setting']['attachdir'].'/forum/'.$newattachfile[$aid], $_G['setting']['attachdir'].'/forum/'.$newattachfile[$aid].'.'.$opname); //重命名原图
					$image->Watermark($_G['setting']['attachdir'].'/forum/'.$newattachfile[$aid].'.'.$opname, 'forum/'.$newattachfile[$aid], 'forum'); //生成带水印的原尺寸图片
					if(file_exists($_G['setting']['attachdir'].'/forum/'.$newattachfile[$aid].'.thumb.jpg')) $image->Watermark($_G['setting']['attachdir'].'/forum/'.$newattachfile[$aid].'.thumb.jpg', '', 'forum'); //给缩略图添加水印

此代码先重命名原图,在名称末尾加入加密后缀,便于权限控制(避免用户根据缩略图地址找到原图),然后再在此图片上另外生成带水印的全尺寸图片。还有一种方法是直接复制原图为原图2,然后在原图上加水印,代码更简单,但复制过程可能更消耗系统资源,代码如下仅供参考:

					copy($_G['setting']['attachdir'].'/forum/'.$newattachfile[$aid], $_G['setting']['attachdir'].'/forum/'.$newattachfile[$aid].'.'.substr(md5('YUANTU'.$newattachfile[$aid].'AAAA'), 0, 8).'.'.array_pop(explode(".", $newattachfile[$aid]))); //复制保留原图
					$image->Watermark($_G['setting']['attachdir'].'/forum/'.$newattachfile[$aid], '', 'forum');

打开 source/function/function_forum.php ,查找:

		$havethumb && @unlink($_G['setting']['attachdir'].'/forum/'.getimgthumbname($filename));

在其下方新增:

		@unlink($_G['setting']['attachdir'].'/forum/'.$filename.'.'.substr(md5('YUANTU'.$filename.'AAAA'), 0, 8).'.'.array_pop(explode(".", $filename))); //删除原图

增加下载图片扣积分

请参考 Discuz! X3 下载图片不扣积分的解决方法
增加下载图片扣积分后,请在模板中去掉原图链接,否则用户无需查看即可下载。

下载原图

按上一步方法修改后,下载到的是带水印的全尺寸图片,怎样让用户下载到无水印原图呢?
打开 source/module/forum/forum_attachment.php 文件,查找:

if($isimage) {
	dheader('Content-Type: image');

在其下方增加:

	$opname = substr(md5('YUANTU'.$attach['attachment'].'AAAA'), 0, 8).'.'.array_pop(explode(".", $attach['attachment']));
	$opfilename = $_G['setting']['attachdir'].'/forum/'.$attach['attachment'].'.'.$opname;
	if(file_exists($opfilename)) {
		$filename = $opfilename;
		$attach['attachment'] = $attach['attachment'].'.'.$opname;
		$filesize = filesize($filename);
	}

您可以根据自己的需要,在这段新增的代码外添加其它判断,例如判断用户是否是VIP会员,如果是则获得无水印原图,不是则获得带水印的全尺寸图片。

欢迎转载分享,转载请注明 来源:大张小站 https://www.zhang.cq.cn/20202264.html
若您喜欢这篇文章,欢迎订阅老张小站以获得最新内容。 / 欢迎交流探讨,请发电子邮件至 mail[at]vdazhang.com 。


欢迎谈谈你的看法(无须登录) *正文中请勿包含"http://"否则将被拦截