如何为自己的网站添加favicon.ico?

如何为自己的网站安装favicon.ico标志?

其实很简单,分两步就完成了:

1.制作一个favicon.ico,可以在网上搜下在线制作ICO的做一个,然后上传到网站根目录;

2.在网站的源码里面添加如下代码,代码放在之间

<link rel="shortcut icon" href="favicon.ico" />

这样就完成了~

PS:少了ico制作工具还是不行的,感谢在线工具的提醒,推荐一个实用的ico制作网站:http://www.atool.org/ico.php

MYSQL ID自增

1. select max(id) from tablename

**2.**SELECT LAST_INSERT_ID() 函数

LAST_INSERT_ID 是与table无关的,如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。

在多用户交替插入数据的情况下max(id)显然不能用。这时就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的 Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update 操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。使用单INSERT语句插入多条记录, LAST_INSERT_ID返回一个列表。

3. select @@IDENTITY;

@@identity 是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。

比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@identity得到的值就是101。使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。

4. SHOW TABLE STATUS;

得出的结果里边对应表名记录中有个Auto_increment字段,里边有下一个自增ID的数值就是当前该表的最大自增ID.

不减当年

自从上了大学,一直是在食堂吃。周末回家了也是饭来张口,所以也就一年多没做饭了,今天重操旧业,手艺还行哈~可以说不减当年0_0.

晒一下下:

food

Fatal error: Allowed memory size of X bytes exhausted (tried to allocate Y bytes)

输出图片的函数出错,提示:

Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 24000 bytes) in C:\wamp\www\test\picture\post.php on line 14

解决的办法有以下三种:

1 . 修改php.ini(推荐)

memory_limit = 128M

把128M改大点,如512或1024,如果不够继续加。

2 . 在程序里面添加如下语句

ini_set(”memory_limit”, ”128M”);

3 . 添加如下内容

php_value memory_limit 128M
Ps :  如果还不能解决,就把它改得再大一些。

php+txt简单留言板

看了一天的php,自己捉摸加参考写了一个简单的留言板,没用到数据库,用了个txt文本文件存留言信息,比较简陋,但基本的留言功能还是实现了。

总共三个文件:一个现实留言页index.php,一个添加留言页add.php,一个文本信息pinglun.txt。

index.php

$file = file("pinglun.txt");$arr=array_reverse($file);//生成倒序遍历的数组,让留言倒序输出?>

留言板

foreach($arr as $key=>$value){for($i=1;$i$s[$i] = $value;{?>";?> }//循环输出留言内容(混编)}//还有一种更简单的输出方式foreach($arr as $another){echo $another;}?>
"."$value"."
姓名:
邮箱:
评论:

add.php:

$user = $_POST['username'];$email = $_post['email'];$content = $_POST['content'];$time = date('Y-m-d H:i:s',time());if (($user=="") and ($title=="") and ($content=="")){echo "你是不是什么也没有填呀?";}else{$txt = fopen('pinglun.txt','a+');$hh = "\r\n";$zc = "用户名: $user 留言时间: $time
留言内容: $content $hh ";
$write = fwrite($txt,$zc);fclose($txt);}?>//留言成功后自动返回首页

 

本地启用IIS后再安装WAMP无法启动

原来在电脑上搭建过IIS8+PHP+MYSQL+phpAdmin,后来由于数据库的原因便放弃了使用,便在网上找了一个WAMP的集成包用,这样就方便很多了,也不用那么麻烦再去费时间配环境了,省事是省事,结果装好之后阿帕奇(Apache)怎么都启动不了,后来想了想应该是之前开了IIS服务器,应该会冲突,于是把IIS给关了,结果阿帕奇马上就能重启了。

IIS

html+css+js好看的梅花

meihua.html:

flute | Welcome to blog

leaves.css:

.leave { position: fixed; width: 25px; height: 20px; -webkit-animation-iteration-count: infinite, infinite; -webkit-animation-direction: normal, normal; -webkit-animation-timing-function: linear, ease-in; -moz-animation-iteration-count: infinite, infinite; -moz-animation-direction: normal, normal; -moz-animation-timing-function: linear, ease-in; -o-animation-iteration-count: infinite, infinite; -o-animation-direction: normal, normal; -o-animation-timing-function: linear, ease-in; animation-iteration-count: infinite, infinite; animation-direction: normal, normal; animation-timing-function: linear, ease-in; } .leave>img { position: fixed; width: 25px; height: 20px; -webkit-animation-iteration-count: infinite; -webkit-animation-direction: alternate; -webkit-animation-timing-function: ease-in-out; -webkit-transform-origin: 50% -100%; -moz-animation-iteration-count: infinite; -moz-animation-direction: alternate; -moz-animation-timing-function: ease-in-out; -moz-transform-origin: 50% -100%; -o-animation-iteration-count: infinite; -o-animation-direction: alternate; -o-animation-timing-function: ease-in-out; -o-transform-origin: 50% -100%; animation-iteration-count: infinite; animation-direction: alternate; animation-timing-function: ease-in-out; transform-origin: 50% -100%; } @-webkit-keyframes fade { 0% { opacity: 1 } 95% { opacity: 1 } 100% { opacity: 0 } } @-webkit-keyframes drop { 0% { -webkit-transform: translate(30px, -50px) } 100% { -webkit-transform: translate(-200px, 650px) } } @-webkit-keyframes clockwiseSpin { 0% { -webkit-transform: rotate(-50deg) } 100% { -webkit-transform: rotate(50deg) } } @-webkit-keyframes counterclockwiseSpinAndFlip { 0% { -webkit-transform: scale(-1, 1) rotate(50deg) } 100% { -webkit-transform: scale(-1, 1) rotate(-50deg) } } @-moz-keyframes fade { 0% { opacity: 1 } 95% { opacity: 1 } 100% { opacity: 0 } } @-moz-keyframes drop { 0% { -moz-transform: translate(30px, -50px) } 100% { -moz-transform: translate(-200px, 650px) } } @-moz-keyframes clockwiseSpin { 0% { -moz-transform: rotate(-50deg) } 100% { -moz-transform: rotate(50deg) } } @-moz-keyframes counterclockwiseSpinAndFlip { 0% { -moz-transform: scale(-1, 1) rotate(50deg) } 100% { -moz-transform: scale(-1, 1) rotate(-50deg) } } @-o-keyframes fade { 0% { opacity: 1 } 95% { opacity: 1 } 100% { opacity: 0 } } @-o-keyframes drop { 0% { -o-transform: translate(30px, -50px) } 100% { -o-transform: translate(-200px, 650px) } } @-o-keyframes clockwiseSpin { 0% { -o-transform: rotate(-50deg) } 100% { -o-transform: rotate(50deg) } } @-o-keyframes counterclockwiseSpinAndFlip { 0% { -o-transform: scale(-1, 1) rotate(50deg) } 100% { -o-transform: scale(-1, 1) rotate(-50deg) } } @keyframes fade { 0% { opacity: 1 } 95% { opacity: 1 } 100% { opacity: 0 } } @keyframes drop { 0% { transform: translate(30px, -50px) } 100% { transform: translate(-200px, 650px) } } @keyframes clockwiseSpin { 0% { transform: rotate(-50deg) } 100% { transform: rotate(50deg) } } @keyframes counterclockwiseSpinAndFlip { 0% { transform: scale(-1, 1) rotate(50deg) } 100% { transform: scale(-1, 1) rotate(-50deg) } } #meihua { background: url(images/xbg.png) no-repeat; width: 278px; height: 155px; right: 0; top: 0; position: fixed; z-index: 1; }

leaves.js:

~(function(doc) { var FallingLeaves = function(num, id) { this.body = doc.body; this.support = false; this.container = id ? doc.getElementById(‘id’) : this.body; this.num = num ? num : 5; this.init() }; FallingLeaves.prototype = { init: function() { this.supportNot(); if (this.support != false) { for (var i = 0; i < this.num; i++) { this.container.appendChild(this.createLeaf()) } } }, supportNot: function() { var domPrefixes = ‘Webkit Moz O ms a’.split(‘ ‘); for (var i = 0; i < domPrefixes.length; i++) { if (this.container.style[domPrefixes[i] + ‘AnimationName’] !== undefined) { this.support = domPrefixes[i]; break } if (domPrefixes[i] == “a”) { if (this.container.style.animationName !== undefined) { this.support = domPrefixes[i]; break } } } }, imgurl: function() { var i = 0, got = -1, len = doc.getElementsByTagName(‘script’).length; while (i <= len && got == -1) { var js_url = doc.getElementsByTagName(‘script’)[i].src, got = js_url.indexOf(‘leaves.js’); i++ } return js_url.replace(‘leaves.js’, ‘images/‘) }, randomInteger: function(low, high) { return low + Math.floor(Math.random() * (high - low)) }, randomFloat: function(low, high) { return low + Math.random() * (high - low) }, pixelValue: function(value) { return value + ‘px’ }, durationValue: function(value) { return value + ‘s’ }, createLeaf: function() { var self = this, leafDiv = doc.createElement(‘div’), image = doc.createElement(‘img’), spinAnimationName = (Math.random() < 0.5) ? ‘clockwiseSpin’ : ‘counterclockwiseSpinAndFlip’, fadeAndDropDuration = self.durationValue(self.randomFloat(5, 11)), spinDuration = self.durationValue(self.randomFloat(4, 8)), leafDelay = self.durationValue(self.randomFloat(0, 5)); leafDiv.className = “leave”; image.src = self.imgurl() + self.randomInteger(1, self.num) + ‘.png’; leafDiv.style.top = self.pixelValue(30); leafDiv.style.right = self.pixelValue(self.randomInteger(0, 50)); if (self.container.style[self.support + ‘AnimationName’] !== undefined) { image.style[self.support + ‘AnimationName’] = spinAnimationName; image.style[self.support + ‘AnimationDuration’] = spinDuration; leafDiv.style[self.support + ‘AnimationName’] = ‘fade, drop’; leafDiv.style[self.support + ‘AnimationDelay’] = leafDelay + ‘, ‘ + leafDelay; leafDiv.style[self.support + ‘AnimationDuration’] = fadeAndDropDuration + ‘, ‘ + fadeAndDropDuration } if (this.support == “a”) { image.style.animationName = spinAnimationName; image.style.animationDuration = spinDuration; leafDiv.style.animationName = ‘fade, drop’; leafDiv.style.animationDelay = leafDelay + ‘, ‘ + leafDelay; leafDiv.style.animationDuration = fadeAndDropDuration + ‘, ‘ + fadeAndDropDuration } leafDiv.appendChild(image); return leafDiv } }; new FallingLeaves(); })(document);

 

查看示例

![](/wp-content/uploads/leaves/images/4.png)
![](/wp-content/uploads/leaves/images/1.png)
![](/wp-content/uploads/leaves/images/2.png)
![](/wp-content/uploads/leaves/images/2.png)
![](/wp-content/uploads/leaves/images/1.png)

foreach的两种用法

foreach 语句只是一种遍历数组简便方法。foreach 仅能用于数组,当试图将其用于其它数据类型或者一个未初始化的变量时会产生错误。有两种语法,第二种比较次要但却是第一种的有用的扩展。

1 . `foreach (array_expression as $value) statement`
第一种格式遍历给定的 `array_expression` 数组。每次循环中,当前单元的值被赋给` $value `并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。
example:
foreach(array_name as $value) { statement; }
这里的`array_name`是你要遍历的数组名,每次循环中,`array_name`数组的当前元素的值被赋给`$value`,并且数组内部的下标向下移一步,也就是下次循环回得到下一个元素。
2 . `foreach (array_expression as $key => $value) statement`
第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量` $key`。
example:
foreach(array_name as $key => $value) { statement; }
这里跟第一种方法的区别就是多了个`$key`,也就是除了把当前元素的值赋给`$value`外,当前元素的键值也会在每次循环中被赋给变量`$key`。键值可以是下标值,也可以是字符串。比如`book[0]=1`中的`0`,以及`book[id]='001'`中的`id`.
【自php 5 起,还可能遍历对象。】
**注: **当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。这意味着不需要在 foreach 循环之前调用 **reset()**。
**注: **除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。因此数组指针不会被 **each()** 结构改变,对返回的数组单元的修改也不会影响原数组。不过原数组的内部指针*的确*在处理数组的过程中向前移动了。假定 foreach 循环运行到结束,原数组的内部指针将指向数组的结尾。
自 php 5 起,可以很容易地通过在 $value 之前加上 & 来修改数组的单元。此方法将以引用赋值而不是拷贝一个值。
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
?>
此方法仅在被遍历的数组可以被引用时才可用(例如是个变量)。

php+mysql简单留言板

add.php

用户:
标签:
内容:

conn.php

list.php

标题: 用户:
内容:

 

PHP文件上传类

class uploadFile { public $max_size = ‘1000000’;//设置上传文件大小 public $file_name = ‘date’;//重命名方式代表以时间命名,其他则使用给予的名称 public $allow_types;//允许上传的文件扩展名,不同文件类型用“|”隔开 public $errmsg = ‘’;//错误信息 public $uploaded = ‘’;//上传后的文件名(包括文件路径) public $save_path;//上传文件保存路径 private $files;//提交的等待上传文件 private $file_type = array();//文件类型 private $ext = ‘’;//上传文件扩展名 /** * 构造函数,初始化类 * @access public * @param string $file_name 上传后的文件名 * @param string $save_path 上传的目标文件夹 / publicfunction* __construct($save_path = ‘./upload/‘,$file_name = ‘date’,$allow_types = ‘’) { $this->file_name   = $file_name;//重命名方式代表以时间命名,其他则使用给予的名称 $this->save_path   = (preg_match(‘//$/‘,$save_path)) ? $save_path : $save_path . ‘/‘; $this->allow_types = $allow_types == ‘’ ? ‘jpg|jpeg|gif|png|zip|rar’ : $allow_types; } /** * 上传文件 * @access public * @param $files 等待上传的文件(表单传来的$_FILES[]) * @return boolean 返回布尔值 / publicfunction* upload_file($files) { $name = $files[‘name’]; $type = $files[‘type’]; $size = $files[‘size’]; $tmp_name = $files[‘tmp_name’]; $error = $files[‘error’]; switch ($error) { case 0 : $this->errmsg = ‘’; break; case 1 : $this->errmsg = ‘*超过了php.ini中文件大小’; break; case 2 : $this->errmsg = **’*超过了MAX_FILE_SIZE 选项指定的文件大小’; break; case 3 : $this->errmsg = **’*文件只有部分被上传’; break; case 4 : $this->errmsg = **’*没有文件被上传’; break; case 5 : $this->errmsg = **’*上传文件大小为0’; break; default : $this->errmsg = **’上传文件失败!’; break; } if($error == 0 && is_uploaded_file($tmp_name)) { //检测文件类型 if($this->check_file_type($name) == FALSE){ *return***FALSE; } //检测文件大小 if($size > $this->max_size){ $this->errmsg = ‘*上传文件.$name.*’*太大,最大支持.ceil($this->max_size/1024).*’kb*的文件’**; returnFALSE*; } $this->set_save_path();//设置文件存放路径 $new_name = $this->file_name != ‘date’ ? $this->file_name.*’.’**.$this->ext : date(*’YmdHis’**).*’.’.$this->ext;//设置新文件名 $this->uploaded = $this->save_path.$new_name;//上传后的文件名 //移动文件 if(move_uploaded_file($tmp_name,$this->uploaded)){ $this->errmsg = ‘*文件.$this->uploaded.上传成功!’; *return***TRUE; }else{ $this->errmsg = 文件.$this->uploaded.**’上传失败!’; *return***FALSE; } } } /** * 检查上传文件类型 * @access public * @param string $filename 等待检查的文件名 * @return 如果检查通过返回TRUE 未通过则返回FALSE和错误消息 / public*function check_file_type($filename){ $ext = $this->get_file_type($filename); $this->ext = $ext; $allow_types = explode(**’|’,$this->allow_types);//分割允许上传的文件扩展名为数组 //echo $ext; //检查上传文件扩展名是否在请允许上传的文件扩展名中 if(in_array($ext,$allow_types)){ return*TRUE**; }else{ $this->errmsg = ‘*上传文件.$filename.*’*类型错误,只支持上传.str_replace(*’|’,**’,’,$this->allow_types).‘ 等文件类型!’; *return***FALSE; } } /** * 取得文件类型 * @access public * @param string $filename 要取得文件类型的目标文件名 * @return string 文件类型 / publicfunction* get_file_type($filename){ $info = pathinfo($filename); $ext = $info[‘extension’]; return $ext; } /** * 设置文件上传后的保存路径 / publicfunction* set_save_path(){ $this->save_path = (preg_match(‘//$/‘,$this->save_path)) ? $this->save_path : $this->save_path . ‘/‘; if(!is_dir($this->save_path)){ //如果目录不存在,创建目录 $this->set_dir(); } } / * 创建目录 * @access public * @param string $dir 要创建目录的路径 * @return boolean 失败时返回错误消息和FALSE / publicfunction* set_dir($dir = null){ //检查路径是否存在 if(!$dir){ $dir = $this->save_path; } if(is_dir($dir)){ $this->errmsg = ‘*需要创建的文件夹已经存在!’; } $dir = explode(*’/‘, $dir); foreach($dir as $v){ if($v){ $d .= $v . ‘/‘; if(!is_dir($d)){ $state = mkdir($d, 0777); if(!$state) $this->errmsg = 在创建目录 . $d . 时出错!’; } } } *return***true; } } /******************************************* * 图片处理类 * * 可以对图片进行生成缩略图,打水印等操作 * 本类默认编码为UTF8 如果要在GBK下使用请将img_mark方法中打中文字符串水印iconv注释去掉 * * 由于UTF8汉字和英文字母大小(像素)不好确定,在中英文混合出现太多时可能会出现字符串偏左 * 或偏右,请根据项目环境对get_mark_xy方法中的$strc_w = strlen($this->mark_str)*7+5进 * 行调整 * 需要GD库支持,为更好使用本类推荐使用GD库2.0+ * * @author kickflip@3ppt.com *************************************************/ class uploadImg extends uploadFile { public $mark_str = kickflip@3ppt.com;  //水印字符串 public $str_r = 0; //字符串颜色R public $str_g = 0; //字符串颜色G public $str_b = 0; //字符串颜色B public $mark_ttf = ‘./upload/SIMSUN.TTC’; //水印文字字体文件(包含路径) public $mark_logo = ‘./upload/logo.png’;    //水印图片 public $resize_h;//生成缩略图高 public $resize_w;//生成缩略图宽 public $source_img;//源图片文件 public $dst_path = ‘./upload/‘;//缩略图文件存放目录,不填则为源图片存放目录 /** * 生成缩略图 生成后的图 * @access public * @param integer $w 缩小后图片的宽(px) * @param integer $h 缩小后图片的高(px) * @param string $source_img 源图片(路径+文件名) / publicfunction* img_resized($w,$h,$source_img = NULL){ $source_img = $source_img == NULL ? $this->uploaded : $source_img;//取得源文件的地址,如果为空则默认为上次上传的图片 if(!is_file($source_img)) { //检查源图片是否存在 $this->errmsg = ‘*文件’.$source_img.*’不存在’; *return***FALSE; } $this->source_img = $source_img; $img_info = getimagesize($source_img); $source = $this->img_create($source_img); //创建源图片 $this->resize_w = $w; $this->resize_h = $h; $thumb = imagecreatetruecolor($w,$h); imagecopyresized($thumb,$source,0,0,0,0,$w,$h,$img_info[0],$img_info[1]);//生成缩略图片 $dst_path = $this->dst_path == ‘’ ? $this->save_path : $this->dst_path; //取得目标文件夹路径 $dst_path = (preg_match(**’//$/‘,$dst_path)) ? $dst_path : $dst_path . ‘/‘;//将目标文件夹后加上/ if(!is_dir($dst_path)) $this->set_dir($dst_path); //如果不存在目标文件夹则创建 $dst_name = $this->set_newname($source_img); $this->img_output($thumb,$dst_name);//输出图片 imagedestroy($source); imagedestroy($thumb); } /** *打水印 *@access public @param string $source_img 源图片路径+文件名 @param* integer $mark_type 水印类型(1为英文字符串,2为中文字符串,3为图片logo,默认为英文字符串) ***@param** integer $mark_postion 水印位置(1为左下角,2为右下角,3为左上角,4为右上角,默认为右下角); @return 打上水印的图片 / publicfunction img_mark($source_img = NULL,$mark_type = 1,$mark_postion = 2) { $source_img = $source_img == NULL ? $this->uploaded : $source_img;//取得源文件的地址,如果为空则默认为上次上传的图片 if(!is_file($source_img)) { //检查源图片是否存在 $this->errmsg = **’*文件’.$source_img.*’不存在’; *return***FALSE; } $this->source_img = $source_img; $img_info = getimagesize($source_img); $source = $this->img_create($source_img); //创建源图片 $mark_xy = $this->get_mark_xy($mark_postion);//取得水印位置 $mark_color = imagecolorallocate($source,$this->str_r,$this->str_g,$this->str_b); switch($mark_type) { case 1 : //加英文字符串水印 $str = $this->mark_str; imagestring($source,5,$mark_xy[0],$mark_xy[1],$str,$mark_color); $this->img_output($source,$source_img); break; case 2 : //加中文字符串水印 if(!is_file($this->mark_ttf)) { //检查字体文件是否存在 $this->errmsg = **’*打水印失败:字体文件’.$this->mark_ttf.*’不存在!’; *return***FALSE; } $str = $this->mark_str; //$str = iconv(‘gbk’,’utf-8’,$str);//转换字符编码 如果使用GBK编码请去掉此行注释 imagettftext($source,12,0,$mark_xy[2],$mark_xy[3],$mark_color,$this->mark_ttf,$str); $this->img_output($source,$source_img); break; case 3 : //加图片水印 if(is_file($this->mark_logo)){  //如果存在水印logo的图片则取得logo图片的基本信息,不存在则退出 $logo_info = getimagesize($this->mark_logo); }else{ $this->errmsg = **’*打水印失败:logo文件’.$this->mark_logo.*’不存在!’; *return***FALSE; } $logo_info = getimagesize($this->mark_logo); if($logo_info[0]>$img_info[0] || $logo_info[1]>$img_info[1]) { //如果源图片小于logo大小则退出 $this->errmsg = **’*打水印失败:源图片’.$this->source_img.*’*比’.$this->mark_logo.*’小!’; *return***FALSE; } $logo = $this->img_create($this->mark_logo); imagecopy ( $source, $logo, $mark_xy[4], $mark_xy[5], 0, 0, $logo_info[0], $logo_info[1]); $this->img_output($source,$source_img); break; default: //其它则为文字图片 $str = $this->mark_str; imagestring($source,5,$mark_xy[0],$mark_xy[1],$str,$mark_color); $this->img_output($source,$source_img); break; } imagedestroy($source); } /* * 取得水印位置 * @access private * @param integer $mark_postion 水印的位置(1为左下角,2为右下角,3为左上角,4为右上角,其它为右下角) * @return array $mark_xy 水印位置的坐标(索引0为英文字符串水印坐标X,索引1为英文字符串水印坐标Y, * 索引2为中文字符串水印坐标X,索引3为中文字符串水印坐标Y,索引4为水印图片坐标X,索引5为水印图片坐标Y) / privatefunction* get_mark_xy($mark_postion){ $img_info = getimagesize($this->source_img); $stre_w = strlen($this->mark_str)9+5 ; //水印英文字符串的长度(px)(5号字的英文字符大小约为9px 为了美观再加5px) //(12号字的中文字符大小为12px,在utf8里一个汉字长度为3个字节一个字节4px 而一个英文字符长度一个字节大小大约为9px // 为了在中英文混合的情况下显示完全 设它的长度为字节数7px) $strc_w = strlen($this->mark_str)7+5 ; //水印中文字符串的长度(px) if(is_file($this->mark_logo)){ //如果存在水印logo的图片则取得logo图片的基本信息 $logo_info = getimagesize($this->mark_logo); } //由于imagestring函数和imagettftext函数中对于字符串开始位置不同所以英文和中文字符串的Y位置也有所不同 //imagestring函数是从文字的左上角为参照 imagettftext函数是从文字左下角为参照 switch($mark_postion){ case 1: //位置左下角 $mark_xy[0] = 5; //水印英文字符串坐标X $mark_xy[1] = $img_info[1]-20;//水印英文字符串坐标Y $mark_xy[2] = 5; //水印中文字符串坐标X $mark_xy[3] = $img_info[1]-5;//水印中文字符串坐标Y $mark_xy[4] = 5;//水印图片坐标X $mark_xy[5] = $img_info[1]-$logo_info[1]-5;//水印图片坐标Y break; case 2: //位置右下角 $mark_xy[0] = $img_info[0]-$stre_w; //水印英文字符串坐标X $mark_xy[1] = $img_info[1]-20;//水印英文字符串坐标Y $mark_xy[2] = $img_info[0]-$strc_w; //水印中文字符串坐标X $mark_xy[3] = $img_info[1]-5;//水印中文字符串坐标Y $mark_xy[4] = $img_info[0]-$logo_info[0]-5;//水印图片坐标X $mark_xy[5] = $img_info[1]-$logo_info[1]-5;//水印图片坐标Y break; case 3: //位置左上角 $mark_xy[0] = 5; //水印英文字符串坐标X $mark_xy[1] = 5;//水印英文字符串坐标Y $mark_xy[2] = 5; //水印中文字符串坐标X $mark_xy[3] = 15;//水印中文字符串坐标Y $mark_xy[4] = 5;//水印图片坐标X $mark_xy[5] = 5;//水印图片坐标Y break; case 4: //位置右上角 $mark_xy[0] = $img_info[0]-$stre_w; //水印英文字符串坐标X $mark_xy[1] = 5;//水印英文字符串坐标Y $mark_xy[2] = $img_info[0]-$strc_w; //水印中文字符串坐标X $mark_xy[3] = 15;//水印中文字符串坐标Y $mark_xy[4] = $img_info[0]-$logo_info[0]-5;//水印图片坐标X $mark_xy[5] = 5;//水印图片坐标Y break; default : //其它默认为右下角 $mark_xy[0] = $img_info[0]-$stre_w; //水印英文字符串坐标X $mark_xy[1] = $img_info[1]-5;//水印英文字符串坐标Y $mark_xy[2] = $img_info[0]-$strc_w; //水印中文字符串坐标X $mark_xy[3] = $img_info[1]-15;//水印中文字符串坐标Y $mark_xy[4] = $img_info[0]-$logo_info[0]-5;//水印图片坐标X $mark_xy[5] = $img_info[1]-$logo_info[1]-5;//水印图片坐标Y break; } return $mark_xy; } /* * 创建源图片 * @access private * @param string $source_img 源图片(路径+文件名) * @return img 从目标文件新建的图像 / privatefunction* img_create($source_img) { $info = getimagesize($source_img); switch ($info[2]){ case 1: if(!function_exists(‘imagecreatefromgif’)){ $source = @imagecreatefromjpeg($source_img); }else{ $source = @imagecreatefromgif($source_img); } break; case 2: $source = @imagecreatefromjpeg($source_img); break; case 3: $source = @imagecreatefrompng($source_img); break; case 6: $source = @imagecreatefromwbmp($source_img); break; default: $source = FALSE; break; } return $source; } /** * 重命名图片 * @access private * @param string $source_img www.3ppt.com 源图片路径+文件名 * @return string $dst_name 重命名后的图片名(路径+文件名) / privatefunction* set_newname($sourse_img) { $info = pathinfo($sourse_img); $new_name = $this->resize_w.‘_’.$this->resize_h.‘_’.$info[‘basename’];//将文件名修改为:宽_高_文件名 if($this->dst_path == ‘’){ //如果存放缩略图路径为空则默认为源文件同文件夹 $dst_name = str_replace($info[‘basename’],$new_name,$sourse_img); }else{ $dst_name = $this->dst_path.$new_name; } return $dst_name; } /** * 输出图片 * @access private * @param $im 处理后的图片 * @param $dst_name 输出后的的图片名(路径+文件名) * @return 输出图片 / publicfunction* img_output($im,$dst_name) { $info = getimagesize($this->source_img); switch ($info[2]){ case 1: if(!function_exists(‘imagegif’)){ imagejpeg($im,$dst_name); }else{ imagegif($im, $dst_name); } break; case 2: imagejpeg($im,$dst_name); break; case 3: imagepng($im,$dst_name); break; case 6: imagewbmp($im,$dst_name); break; } } } ?>