php 加水印 等比例缩放程序
php 加水印 等比例缩放程序
function watermark($desImg,$waterImg,$positon=1,$saveas=false,$alpha=30)
011 {
012 //获取目图片的基本信息
013 $temp=pathinfo($desImg);
014 $name=$temp["basename"];//<SPAN class=t_tag onclick=tagshow(event) href="tag.php?name=%CE%C4%BC%FE">文件</SPAN>名
015 $path=$temp["dirname"];//文件所在的文件夹
016 $extension=$temp["extension"];//文件扩展名
017 if($saveas)
018 {
019 //需要另存为
020 $name=rtrim($name,".$extension")."_2.";//重新命名
021 $savepath=$path."/".$name.$extension;
022 }
023 else
024 {
025 //不需要另存为则覆盖原图
026 $savepath=$path."/".$name;
027 }
028 $info=getImageInfo($desImg);//获取目标图片的信息
029 $info2=getImageInfo($waterImg);//获取水印图片的信息
030
031 $desImg=create($desImg);//从原图创建
032 $waterImg=create($waterImg);//从水印图片创建
033 //位置1:顶部居左
034 if($positon==1)
035 {
036 $x=0;
037 $y=0;
038 }
039 //位置2:顶部居右
040 if($positon==2)
041 {
042 $x=$info[0]-$info2[0];
043 $y=0;
044 }
045 //位置3:居中
046 if($positon==3)
047 {
048 $x=($info[0]-$info2[0])/2;
049 $y=($info[1]-$info2[1])/2;
050 }
051 //位置4:底部居左
052 if($positon==4)
053 {
054 $x=0;
055 $y=$info[1]-$info2[1];
056 }
057 //位置5:底部居右
058 if($positon==5)
059 {
060 $x=$info[0]-$info2[0];
061 $y=$info[1]-$info2[1];
062 }
063 imagecopymerge($desImg,$waterImg,$x,$y,0,0,$info2[0],$info2[1],$alpha);
064 imagejpeg($desImg,$savepath);
065 imagedestroy($desImg);
066 imagedestroy($waterImg);
067 return $savepath;
068 }
069 /**
070 * 获取图片的信息,width,height,image/type
071 * @param string $src 图片路径
072 * @return <SPAN class=t_tag onclick=tagshow(event) href="tag.php?name=%CA%FD%D7%E9">数组</SPAN>
073 * **/
074 function getImageInfo($src)
075 {
076 return getimagesize($src);
077 }
078 /**
079 * 创建图片,返回资源类型
080 * @param string $src 图片路径
081 * @return resource $im 返回资源类型
082 * **/
083 function create($src)
084 {
085 $info=getImageInfo($src);
086 switch ($info[2])
087 {
088 case 1:
089 $im=imagecreatefromgif($src);
090 break;
091 case 2:
092 $im=imagecreatefromjpeg($src);
093 break;
094 case 3:
095 $im=imagecreatefrompng($src);
096 break;
097 }
098 return $im;
099 }
100 /**
101 * 缩略图主函数
102 * @param string $src 图片路径
103 * @param int $w 缩略图宽度
104 * @param int $h 缩略图高度
105 * @return mixed 返回缩略图路径
106 * **/
107
108 function resize($src,$w,$h)
109 {
110 $temp=pathinfo($src);
111 $name=$temp["basename"];//文件名
112 $dir=$temp["dirname"];//文件所在的文件夹
113 $extension=$temp["extension"];//文件扩展名
114 $savepath="{$dir}/{$name}.thumb.jpg";//缩略图保存路径,新的文件名为*.thumb.jpg
115
116 //获取图片的基本信息
117 $info=getImageInfo($src);
118 $width=$info[0];//获取图片宽度
119 $height=$info[1];//获取图片高度
120 $per1=round($width/$height,2);//计算原图长宽比
121 $per2=round($w/$h,2);//计算缩略图长宽比
122
123 //计算缩放比例
124 if($per1>$per2||$per1==$per2)
125 {
126 //原图长宽比大于或者等于缩略图长宽比,则按照宽度优先
127 $per=$w/$width;
128 }
129 if($per1<$per2)
130 {
131 //原图长宽比小于缩略图长宽比,则按照高度优先
132 $per=$h/$height;
133 }
134 $temp_w=intval($width*$per);//计算原图缩放后的宽度
135 $temp_h=intval($height*$per);//计算原图缩放后的高度
136 $temp_img=imagecreatetruecolor($temp_w,$temp_h);//创建画布
137 $im=create($src);
138 imagecopyresampled($temp_img,$im,0,0,0,0,$temp_w,$temp_h,$width,$height);
139 if($per1>$per2)
140 {
141 imagejpeg($temp_img,$savepath);
142 return addBg($savepath,$w,$h,"w");
143 //宽度优先,在缩放之后高度不足的情况下补上背景
144 }
145 if($per1==$per2)
146 {
147 imagejpeg($temp_img,$savepath);
148 return $savepath;
149 //等比缩放
150 }
151 if($per1<$per2)
152 {
153 imagejpeg($temp_img,$savepath);
154
155 return addBg($savepath,$w,$h,"h");
156 //高度优先,在缩放之后宽度不足的情况下补上背景
157 }
158 }
159 /**
160 * 添加背景
161 * @param string $src 图片路径
162 * @param int $w 背景图像宽度
163 * @param int $h 背景图像高度
164 * @param String $first 决定图像最终位置的,w 宽度优先 h 高度优先 wh:等比
165 * @return 返回加上背景的图片
166 * **/
167 function addBg($src,$w,$h,$fisrt="w")
168 {
169 $bg=imagecreatetruecolor($w,$h);
170 $white = imagecolorallocate($bg,255,255,255);
171 imagefill($bg,0,0,$white);//填充背景
172
173 //获取目标图片信息
174 $info=getImageInfo($src);
175 $width=$info[0];//目标图片宽度
176 $height=$info[1];//目标图片高度
177 $img=create($src);
178 if($fisrt=="wh")
179 {
180 //等比缩放
181 return $src;
182 }
183 else
184 {
185 if($fisrt=="w")
186 {
187 $x=0;
188 $y=($h-$height)/2;//垂直居中
189 }
190 if($fisrt=="h")
191 {
192 $x=($w-$width)/2;//水平居中
193 $y=0;
194 }
195 imagecopymerge($bg,$img,$x,$y,0,0,$width,$height,100);
196 imagejpeg($bg,$src);
197 imagedestroy($bg);
198 imagedestroy($img);
199 return $src;
200 }
201
202 }
php 文件上传代码,限制jpg文件
<?php
/* 图片上传类 www.lost63.com原创代码 仅限JPG格式图片 */
class uploadFile
{
var $inputName; //input名称
var $fileName; //文件命名
var $fileProperty; //文件属性
var $fileSize=2097152; //文件大小限制,2M
var $filePath="upload/"; //文件存储路径
function uploadFile($inputName){
$this->inputName=$inputName;
$this->getName(); //取得新的名称
$this->fileSave();
}
//随机名称
private function getName(){
$this->fileName=date("YmdHms").rand(0,9).$this->getProperty();
}
//文件属性,返回后辍名
private function getProperty(){
if($_FILES[$this->inputName]["type"]=="image/pjpeg"||$_FILES[$this->inputName]["type"]=="image/jpeg"){
return ".jpg";
}else{
exit("文件格式不对");
}
}
//文件存储
private function fileSave(){
if($_FILES[$this->inputName]["size"]>$this->fileSize){
exit("文件太大,最大限制为".$this->fileSize."字节");
}
if(!file_exists($this->filePath)){
mkdir($this->filePath); //如果文件存储目录不存在,则建立;
}
move_uploaded_file($_FILES[$this->inputName]["tmp_name"],
$this->filePath.$this->fileName);
}
}
if($_GET['action']=="fileSave"){
$f=new uploadFile("file");
echo '<input name="textfield" type="text" size="30" value="'.$f->filePath.$f->fileName.'" /> 上传成功! <a href="'.$f->filePath.$f->fileName.'">浏览</a>';
}else{
echo '<form action="?action=fileSave" method="post" enctype="multipart/form-data" name="form1" id="form1">
<input type="file" name="file" size="30" />
<input type="submit" name="Submit" value="提交" />
</form>';
}
?>
$_SERVER['PHP_SELF']:当前正在执行脚本的文件名,与document root相关。
$_SERVER['argv']:传递给该脚本的参数。
$_SERVER['argc']:包含传递给程序的命令行参数的个数(如果运行在命令行模式)。
$_SERVER['GATEWAY_INTERFACE']:服务器使用的CGI规范的版本,例如:“CGI/1.1”。
$_SERVER['SERVER_NAME']:当前运行脚本所在服务器主机的名称。
$_SERVER['SERVER_SOFTWARE']:服务器标识的字串,在响应请求时的头部中给出。
$_SERVER['SERVER_PROTOCOL']:请求页面时通信协议的名称和版本,例如:“HTTP/1.0”。
$_SERVER['REQUEST_METHOD']:访问页面时的请求方法,例如:“GET”、“HEAD”、“POST”、“PUT”。
$_SERVER['QUERY_STRING']:查询(query)的字符串。
$_SERVER['DOCUMENT_ROOT']:当前运行脚本所在的文档根目录,在服务器配置文件中定义。
$_SERVER['HTTP_ACCEPT']:当前请求的Accept: 头部的内容。
$_SERVER['HTTP_ACCEPT_CHARSET']:当前请求的Accept-Charset: 头部的内容,例如:“iso-8859-1,*,utf-8”。
$_SERVER['HTTP_ACCEPT_ENCODING']:当前请求的Accept-Encoding: 头部的内容,例如:“gzip”。
$_SERVER['HTTP_ACCEPT_LANGUAGE']:当前请求的Accept-Language: 头部的内容,例如:“en”。
$_SERVER['HTTP_CONNECTION']:当前请求的Connection: 头部的内容,例如:“Keep-Alive”。
$_SERVER['HTTP_HOST']:当前请求的Host: 头部的内容。
$_SERVER['HTTP_REFERER']:链接到当前页面的前一页面的URL地址。
$_SERVER['HTTP_USER_AGENT']:当前请求的User_Agent: 头部的内容。
$_SERVER['REMOTE_ADDR']:正在浏览当前页面用户的IP地址。
$_SERVER['REMOTE_HOST']:正在浏览当前页面用户的主机名。
$_SERVER['REMOTE_PORT']:用户连接到服务器时所使用的端口。
$_SERVER['SCRIPT_FILENAME']:当前执行脚本的绝对路径名。
$_SERVER['SERVER_ADMIN']:管理员信息。
$_SERVER['SERVER_PORT']:服务器所使用的端口。
$_SERVER['SERVER_SIGNATURE']:包含服务器版本和虚拟主机名的字符串。
$_SERVER['PATH_TRANSLATED']:当前脚本所在文件系统(不是文档根目录)的基本路径。
$_SERVER['SCRIPT_NAME']:包含当前脚本的路径,这在页面需要指向自己时非常有用。
$_SERVER['REQUEST_URI']:访问此页面所需的URI,例如:“/index.html”。
$_SERVER['PHP_AUTH_USER']:当PHP运行在Apache模块方式下,并且正在使用HTTP认证功能,这个变量便是用户输入的用户名。
$_SERVER['PHP_AUTH_PW']:当PHP运行在Apache模块方式下,并且正在使用HTTP认证功能,这个变量便是用户输入的密码。
$_SERVER['AUTH_TYPE']:当PHP运行在Apache模块方式下,并且正在使用HTTP认证功能,这个变量便是认证的类型。
您没有足够的执行许可。例如,如果试图访问的 ASP 页所在的目录权限设为“无”,或者,试图执行的 CGI 脚本所在的目录权限为“只允许脚本”,将出现此错误信息。若要修改执行权限,请在 Microsoft 管理控制台 (MMC) 中右击目录,然后依次单击属性和目录选项卡,确保为试图访问的内容设置适当的执行权限。
您没有将试图执行的文件类型的脚本映射设置为识别所使用的谓词(例如,GET 或 POST)。若要验证这一点,请在 MMC 中右击目录,依次单击属性、目录选项卡和配置,然后验证相应文件类型的脚本映射是否设置为允许所使用的谓词。
403.2 - 读访问被禁止。验证是否已将IIS设置为允许对目录进行读访问。另外,如果您正在使用默认文件,请验证该文件是否存在。
403.3 - 写访问被禁止。验证IIS权限和NTFS限是否已设置以便向该目录授予写访问权。
403.4 - 要求 SSL.禁用要求安全通道选项,或使用 HTTPS 代替 HTTP 来访问该页面。
403.5 - 要求 SSL 128.禁用要求 128 位加密选项,或使用支持 128 位加密的浏览器以查看该页面。
403.6 - IP地址被拒绝。服务器配置拒绝访问您目前的IP地址。
403.7 - 要求客户端证书。您已把您的服务器配置为要求客户端身份验证证书,但您未安装有效的客户端证书。
403.8 - 站点访问被拒绝。您已为您用来访问服务器的域设置了域名限制。
403.9 - 用户数过多。与该服务器连接的用户数量超过了IIS设置的连接数。
403.12 - 拒绝访问映射表。您要访问的页面要求提供客户端证书,但映射到您的客户端证书的用户 ID 已被拒绝访问该文件。
404 - 未找到。发生此错误的原因是您试图访问的文件已被移走或删除。
500 - 内部服务器错误。造成500错误常见原因有:ASP语法出错、ACCESS数据库连接语句出错、文件引用与包含路径出错、使用了服务器不支持的组件如FSO等
500.12 - 服务器错误:Web 服务器上的应用程序正在重新启动。这表示您在 IIS 重新启动应用程序的过程中试图加载 ASP 页。刷新页面后,此信息即会消失。如果刷新页面后,此信息再次出现,可能是防病毒软件正在扫描 Global.asa 文件。
500-100.ASP - ASP 错误。如果试图加载的 ASP 页中含有错误代码,将出现此错误信息。若要获得更确切的错误信息,请禁用友好 HTTP 错误信息。默认情况下,只会在默认 Web 站点上启用此错误信息。
502 - 网关错误。如果试图运行的 CGI 脚本不返回有效的 HTTP 标头集,将出现此错误信息。
1、错误号401.1 - 未经授权:访问由于凭据无效被拒绝。由于用户匿名访问使用的账号(默认是IUSR_机器名)被禁用,或者没有权限访问计算机,将造成用户无法访问。
解决方案:
(1)查看IIS管理器中站点安全设置的匿名帐户是否被禁用,如果是,请尝试用以下办法启用:
控制面板->管理工具->计算机管理->本地用户和组,将IUSR_机器名账号启用。如果还没有解决,请继续下一步。
(2)查看本地安全策略中,IIS管理器中站点的默认匿名访问帐号或者其所属的组是否有通过网络访问服务器的权限,如果没有尝试用以下步骤赋予权限:
开始->程序->管理工具->本地安全策略->安全策略->本地策略->用户权限分配,双击“从网络访问此计算机”,添加IIS默认用户或者其所属的组。
注意:一般自定义 IIS默认匿名访问帐号都属于组,为了安全,没有特殊需要,请遵循此规则。
2、错误号401.2 HTTP 错误 401.2 - 未经授权:访问由于服务器配置被拒绝。原因:关闭了匿名身份验证。
解决方案:
运行inetmgr,打开站点属性->目录安全性->身份验证和访问控制->选中“启用匿名访问”,输入用户名,或者点击“浏览”选择合法的用户,并两次输入密码后确定。
3、错误号:401.3 HTTP 错误 401.3 - 未经授权:访问由于 ACL 对所请求资源的设置被拒绝。
原因:IIS匿名用户一般属于Guests组,而我们一般把存放网站的硬盘的权限只分配给administrators组,这时候按照继承原则,网站文件夹也只有administrators组的成员才能访问,导致IIS匿名用户访问该文件的NTFS权限不足,从而导致页面无法访问。
100 - 表示已收到请求的一部分,正在继续发送余下部分。
101 - 切换协议。
2xx - 成功。服务器成功地接受了客户端请求:
200 - 确定。客户端请求已成功。
201 - 已创建。
202 - 已接受。
203 - 非权威性信息。
204 - 无内容。
205 - 重置内容。
206 - 部分内容。
300 - 针对收到请求,服务器可执行多种操作。
301 - 永久移动转移,请求的内容已永久移动其他新位置。
302 - 临时移动转移,请求的内容已临时移动新的位置。
304 - 未修改。自从上次请求后,请求的内容未修改过。
307 - 临时重定向。服务器目前从不同位置响应请求,但请求者应继续使用原有位置来进行以后的请求。
400 - 错误的请求。
401 - 访问被拒绝。IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示:
401.1 - 登录失败。
401.2 - 服务器配置导致登录失败。
401.3 - 由于 ACL 对资源的限制而未获得授权。
401.4 - 筛选器授权失败。
401.5 - ISAPI/CGI 应用程序授权失败。
401.7 - 访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。
403 - 禁止访问:IIS 定义了许多不同的 403 错误,它们指明更为具体的错误原因:
403.1 - 执行访问被禁止。
403.2 - 读访问被禁止。
403.3 - 写访问被禁止。
403.4 - 要求 SSL。
403.5 - 要求 SSL 128。
403.6 - IP 地址被拒绝。
403.7 - 要求客户端证书。
403.8 - 站点访问被拒绝。
403.9 - 用户数过多。
403.10 - 配置无效。
403.11 - 密码更改。
403.12 - 拒绝访问映射表。
403.13 - 客户端证书被吊销。
403.14 - 拒绝目录列表。
403.15 - 超出客户端访问许可。
403.16 - 客户端证书不受信任或无效。
403.17 - 客户端证书已过期或尚未生效。
403.18 - 在当前的应用程序池中不能执行所请求的 URL.这个错误代码为 IIS 6.0 所专用。
403.19 - 不能为这个应用程序池中的客户端执行 CGI.这个错误代码为 IIS 6.0 所专用。
403.20 - Passport 登录失败。这个错误代码为 IIS 6.0 所专用。
404 - 未找到请求的内容。
404.0 - 未找到文件或目录。
404.1 - 无法在所请求的端口上访问 Web站点。
404.2 - Web 服务扩展锁定策略阻止本请求。
404.3 - MIME 映射策略阻止本请求。
405 - 用来访问本页面的 HTTP 谓词不被允许(方法不被允许) 。
406 - 客户端浏览器不接受所请求页面的 MIME 类型。
407 - 要求进行代理身份验证。
412 - 前提条件失败。
413 - 请求实体太大。
414 - 请求 URI 太长。
415 - 不支持的媒体类型。
416 - 所请求的范围无法满足。
417 - 执行失败。
423 - 锁定的错误。
500 - 服务器内部错误。
500.12 - 应用程序正忙于在 Web 服务器上重新启动。
500.13 - Web 服务器太忙。
500.15 - 不允许直接请求 Global.asa。
500.16 - UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。
500.18 - URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。
500.100 - 内部 ASP 错误。
501 - 服务器无法完成请求的功能。
502 - 服务器用作网关或代理服务器时收到了无效响应。
502.1 - CGI 应用程序超时。
502.2 - CGI 应用程序出错。
503 - 服务不可用。这个错误代码为 IIS 6.0 所专用。
504 - 网关超时。
505 - HTTP 版本不受支持。
常见的 HTTP 状态代码及其原因
200 - 成功。IIS 已成功处理发送的请求。
304 - 未修改。客户端请求的内容已在其缓存中,内容自缓存以来尚未被修改过。客户端使用内容的缓存副本,而不从服务器下载内容。
401.1 - 登录失败。登录不成功,可能因为用户名或密码访问无效。
401.3 - 服务列表对资源的限制而未获得授权。表示存在NTFS权限问题,或者对试图访问的文件具备相应的权限,也可能发生此错误。
403.1 - 执行访问被禁止。
我们经常会采集其它网站上的内容,以前有讲过用fopen,filecontent,curl等函数实例,今天我们就来fsockopen来实现这种读取远程 服务器上的图片方法吧。
<?php
function getFileSize($url){
$url = parse_url($url);
if($fp = @fsockopen($url['host'],empty($url['port'])?80:$url['port'],$error)){
fputs($fp,"GET ".(empty($url['path'])?'/':$url['path'])." HTTP/1.1rn");
fputs($fp,"Host:$url[host]rnrn");
while(!feof($fp)){
$tmp = fgets($fp);
if(trim($tmp) == ''){
break;
}else if(preg_match('/Content-Length:(.*)/si',$tmp,$arr)){
return trim($arr[1]);
}
}
return null;
}else{
return null;
}
}
?>
调用方法很简单,代码如下:
<?php
echo getFileSize(http://www.111cn.net/banner/banner.gif/)
?>
相关文章
- 本文来为大家介绍一下,使用python中的库实现给图片添加文字水印,openCV可以给图片添加水印,如果要添加汉字水印那就要使用PIL库...2021-09-26
- 用PHP给上传图片加水印的程序是通过判定文件类型建立图形,然后把其复制到原建立的图形上,填充并建立rectangle,以备写入imagestring()或是原已经定好的图像程序当中判定水...2016-11-25
- php 加水印 等比例缩放程序 function watermark($desImg,$waterImg,$positon=1,$saveas=false,$alpha=30) 011 { 012 //获取目图片的基本信息 013 $temp=pathinfo(...2016-11-25
- 分享一个网友写的php图片上传类,支持加水印,生成略缩图功能哦,面是配置和可以获取的一些信息(每一个配置信息都有默认值,如无特殊需要,可以不配置): 代码如下 ...2016-11-25
- 尚未测试 CODE: <?php /****************************************************************************** 参数说明: $max_file_size : 上传文件大小限制, 单位BY...2016-11-25
- 这是一款完美的php文件上传代码,图片上传成功后并自动给图片增加上水印,这样很好的快速的提高的了要手工一张张增加水印效果。 代码如下 复制代码 ...2016-11-25
PHP imagecopy()与imagecopymerge()图像添加水印
图像添加水印在php中有很多种办法可以实现,他这些功能都是基于php中的GD库的,如果没有开户GD库是不可以使用水印功能的。 imagecopymerge() 函数用于拷贝并合并图像...2016-11-25- 等比例生成缩略图的php程序 这个程序很实现,但只是用来进来等比例生成缩略图哦,你要把文件上传到服务器,然后再由此函数来操作,有需要的朋友参考一下。 等比例生成缩...2016-11-25
- 本文章来为各位介绍一篇关于php新浪云平台给图片添加水印方法的例子,希望这篇教程能够帮助到各位使用新浪云平台的朋友. <?php //原文件名 $file_name = $_FILES[...2016-11-25
- 代码如下 复制代码 <!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.d...2016-11-25
- 这篇文章主要介绍了C#给Excel添加水印实例的相关资料,需要的朋友可以参考下...2020-06-25
- 下面我们来看一篇关于php使用imagick给图片加水印的方法吧,希望这篇文章能够让各位了解到imagick图片加水印的个方法方式。 <?php $image = new Imagick(); $ima...2016-11-25
- 本文章收藏了四款关于利用php 等比例缩小图片代码函数,我们可定义图片宽度或高度对图片缩小或放大的图片宽度哦,好了看看四款实例那一款适合于你吧。 代码...2016-11-25
- 给自己网站上的图片添加水印,在图片上留下属于自己的信息,这有两个好处:一是宣传自己的品牌,二是就算带图片的文章被转载了,也会自动的留下了版权。 本文主要实现了php...2016-11-25
- 在php中要实现图片增加水印我们要用到的函数有很多,imagecreatefromjpeg,imagecreatefrompng,getimagesize等等函数,这些都是属于php GD库的函数,所以我们必须在php.ini...2016-11-25
- 我们经常会碰到要对大量的图片进行一次性增加水印,这就会碰到批量增加图片水印功能了,我们为你提供一款php批量增加水印的功能。 //config.php //==============...2016-11-25
- function Watermark_IM($preview = 0) { global $watermarkstatus, $watermarktype, $watermarktrans, $watermarkquality, $watermarktext, $imageimpath; $w...2016-11-25
- asp.net 图片超过指定大小后等比例压缩图片的方法,需要的朋友可以参考一下...2021-09-22
- fck 上传图片增加水印代码修改 //我们只要找到editor/filemanger/conectors/php/commands.php文件把下面这段php代码替换成你的commands.php文件就行了。 functio...2016-11-25
- <?php /* ClassName: ImageHandler * Filename: ImageHandler.phpcls * Author: Tony Don * Date: 2008-03-27 * @Copy...2016-11-25