<?php
////$strimgsrc = file_get_contents("http://127.0.0.1/5307754.jpg");
////$imgsrc = imagecreatefromstring($strimgsrc);
$imgsrc = imagecreatefromjpeg("5307754.jpg");
$imgsrcw = imagesx($imgsrc);
$imgsrch = imagesy($imgsrc);
$width = 30;
$x1 = 2;
$x2 = $imgsrcw - $x1 - 20;
$y1 = ($imgsrch - $width) - 2;
$y2 = $y1 + $width;
$steps = $x2 - $x1;
for($i = 0; $i < $steps; $i ++)
{
$alphax = round($i/($steps/127))+60;
if($alphax >= 128)
$alphax = 127;
$alpha = imagecolorallocatealpha($imgsrc, 255, 255, 255, $alphax);
imagefilledrectangle($imgsrc, ($i+$x1), $y1, ($i+$x1+1), $y2, $alpha);
}
header('content-type: image/jpeg');
imagejpeg($imgsrc);
imagedestroy($imgsrc);
?>
就会更喜欢自己学习的东西!
举例说明:
今天学习PHP的图像函数部分,学习了几个函数,他们分别是:
getimagesize()
array getimagesize ( string $filename [, array &$imageinfo ] )
getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。
imagecreatefromgif()
resource imagecreatefromgif ( string $filename )
imagecreatefromgif() 返回一图像标识符,代表了从给定的文件名取得的图像。
意思就是以后为了方便使用这个图片资源,这个函数返回一个操作的句柄。
类似的函数还有imagecreatefromjpeg(),imagecreatefrompng() 当然还有很多,大家可以看官方在线手册
imagecolorat()
int imagecolorat ( resource $image , int $x , int $y )
返回 image 所指定的图形中指定位置像素的颜色索引值。
imagecolorsforindex()
array imagecolorsforindex ( resource $image , int $index )
本函数返回一个具有 red,green,blue 和 alpha 的键名的关联数组,包含了指定颜色索引的相应的值。
大家看了一段生硬的介绍,估计困了,不过请坚持一下!
那么学了这几个函数后,怎么练习一下呢?
其实我学到这几个函数,就立即想到了一个很好玩的东西可以做!
是什么?你猜猜~!!!!
看代码:
<?php
$url = "logo-yy.gif";
$size = getimagesize($url);
$width = $size[0];
$height = $size[1];
$im = imagecreatefromgif($url);
for($y=1;$y<$height;$y++){
for($x=1;$x<$width;$x++){
$color_index = imagecolorat($im, $x, $y);
$color_tran = imagecolorsforindex($im, $color_index);
echo("<span c\" color:RGB(".$color_tran['red'].",".$color_tran['green'].",".$color_tran['blue'].");\">");
echo("爱");
echo("</span>");
}
echo("<br>");
}
?>
要注意的是我的程序里用的函数是imagecreatefromgif()
所以变量$url指向的文件应该是GIF格式的,如果想指向JPG格式的文件要用imagecreatefromjpeg()
当然我们可以写在一起,因为第一个函数就可以判断图片的格式,我在这里就不写了!!哈哈
好了,有php环境的赶紧试试是什么吧!呵呵
不建议用太大的图片!小logo就好了!
不然,你可别怪我没告诉你啊!
这个例子没什么实际用途!!但是他可以激发大家学习的乐趣!!
献给正在学习PHP的人!
而且给的数据是HTML代码串,比如这样:
<div class=”aaa”><a href=/blog_article/”/aaa/id/1″/gt;张三/lt;/a/gt;.html 评论了 <a href=/blog_article/”/aaa/id/444″/gt;李四/lt;/a/gt;.html 分享的 <a href=/blog_article/”bbb.html”>一篇文章文章一长串的东西</a></div>_/p/index.html>
截取的时候是要截取 div 标签内部的东西,而且要保留HTML标签,只是对其中的文字做处理。比如我可能只是截取到“李四”的“李”字,但是如果就这样放到前端的话,“李四”前面的 a 标签是没有闭合的,所以截取之后要保证HTML的语法正确。
这个问题确实不太好搞,让我郁闷了两天。请注意,这只是一个字符串,只不过内容是HTML代码,是没有什么DOM的。如果是在前端处理就好办了,直接DOM获取,然后对里面的节点进行处理,最后把innerHTML 之类的东西输出就搞定了。现在可不行了,得换个思路。同事的思路是这样的:
遍历字符串的每一个字符。设置一个标记,碰到标签开始的标记< 就置为1,接下来的字符都不记数,然后碰到>之后再开始计数。对标签内部的字符串处理的时候,还要先判断当前字符的编码是不是可能是中文,一般来说PHP中 UTF-8 编码的中文字符的长度都是3,所以如果碰到是中文字符编码,就要跳过两个不记数……说到这里我自己头已经开始大了。个人认为这种方法很不爽,首先这种精致的逻辑不太容易控制,而且 UFT-8 编码下中文产生的长度有可能是3个或4个 所以代码的严密性值得怀疑。
我个人的思路是,用 Tidy 来搞(具体用法请看PHP手册吧)。昨天研究了一下那个 Tidy ,发现这个东西还是挺好用的。首先,把这个字符串转换成 Tidy 对象,这样:
$tidy = tidy_parse_string($str, array(), ‘utf8′); // 最后一个是设置编码的,注意,这里是utf8 ,不是utf-8,没有中间那个连线。
然后获取$tidy中的 body(因为转换之后$tidy会自动加上<head><body>等标签):
$body = tidy_get_body($tidy);
这个时候你可以用 var_dump 看一些 $body 的结构,会发现它把每个标签都变成了一个对应的对象,里面有相应的属性。举例来说,比如 <a href=/blog_article/”/index.html ,这么一条语句对应的一些属性有:
name=>”a”
value => “<a href=/blog_article/”/index.html”
child=> array{[0]=>一个文本节点对象,value是 sdf}
attribute=array{”href”=>”#”}
…..其他属性
可以看到,我们其实是可以单独去处理 a 标签对应节点下面的文字节点的值的,那样就不会破坏任何HTML完整性。原来我以为改变 a 标签中文字节点的值之后, a 标签的value也会跟着改变,那样我直接返回a标签对应节点的value就OK了,没想到不是那个样子,哎,所以处理过其中的文字之后还是要自己拼出新的HTML。
知道了Tidy对象的结构之后,一切就好办了,只要遍历所有的节点,对于本需求来说,就是找到那个 div 标签,然后开始处理里面的节点。代码如下:
if(mb_strwidth($subchild->value, ‘utf-8′) >= $len)
{
$subchild->value = mb_strimwidth($subchild->value, 0, $len, ‘…', ‘utf-8′);
$trimed_str .= $subchild->value;
break;
}
else
{
$trimed_str .= $subchild->value;
$len = $len - mb_strwidth($subchild->value, ‘utf-8′);
}
里面的$subchild 就是一个子节点。注意,这里使用了 mb_strwidth 来获取字符串长度。严重推荐一下这个 mb_strwidth,很好用,它会把中文当作两个字符长度处理,正好符合这里的需求!而且截取字符串的时候用到了 mb_strimwidth,这个函数也会把中文当作两个字符长度处理,mb_ 开头的函数真是好用啊。
具体代码我就不写出来了,因为是针对一个需求写的,没做成通用的形式。哪天我有时间做成通用的再发布一下。
另外,可惜FireFox不支持 text-overflow 属性,不然也不用后台那么辛苦地去截断了。如果大家有更好的方法,欢迎提出!不胜感激。