本节分享一个图片处理类,简单实现了文字水印与图片水印,是学习php图片操作的小例子。
代码:
<?php class ImageModifier { /** * 实现在图片上保存文本信息 * * default is array() * * @access private */ var $aTextData = array(); /** * 保存文本信息到图片上 * * default is array() * * @access private */ var $aImageData = array(); /** * imagick的资源标识符 * * default is FALSE * * @access private */ var $image = ""; /** * 错误消息级别 * * default is 0 * * @varinteger */ var $sError = 0; /** * 构造函数 * * @param string $tplImage template image * @access private */ public function __construct($tplImage) { // Check Imagick class exist or not if not show error. if (!class_exists("Imagick", false)) { exit("Unable to load class: Imagick\n. Imagick Image Library Missing."); } // create a object of Imagick template image $this->image = new Imagick($tplImage); } /** * 设置文本属性 * * @param string $sText text to print on the image (i.e. Buy 1 Get 1 Free ) * @param integer $x text to print from x codinates * @param integer $y text to print from y codinates * @param integer $font text size for printing * @param string $color text color for print * @param integer $text_anglerotate text from 0-360 * @param string $font_style installed font name and path (i.e /usr/share/fonts/liberation/LiberationSans-Italic.ttf) * @Creating an array of text properties */ public function setText($sText, $x = 0, $y = 0, $font = 12, $color = 'black', $text_angle = 0, $font_style = './LiberationSans-Italic.ttf') { $this->aTextData[] = array("text"=>$sText, "font_color"=>$color, "font_size"=>$font,"x"=>$x,"y"=>$y, "font_style"=>$font_style, "text_angle"=>$text_angle); } /** * 设置图片属性 * * @param string $sImage text to print on the image (i.e. /home/httpd/images/brand.jpg ) * @param integer $x text to print from x codinates * @param integer $y text to print from y codinates * @param integer $text_anglerotate text from 0-180 * @Creating an array of image properties */ public function setImage($sImage, $x = 0, $y = 0, $angle=0) { $this->aImageData[] = array("image"=>$sImage, "x"=>$x, "y"=>$y, "angle"=>$angle); } /** * 从文字和图片属性生成最终图像 * * @param string $sImage Output image Name * @return boolean returns TRUE on success and FALSE upon failure */ public function generateImage($sImage) { foreach ($this->aImageData as $aImageValue) { if (!trim($aImageValue["image"])) { $sError = 1; break; } $oImg = new Imagick($aImageValue["image"]); $oImg->rotateImage("transparent", $aImageValue["angle"]); $this->image->compositeImage($oImg, $oImg->getImageCompose(), $aImageValue["x"], $aImageValue["y"]); unset($oImg); } foreach ($this->aTextData as $aTextValue){ if (!trim($aTextValue['text'])) { $sError = 2; break; } $oDraw = new ImagickDraw(); $oDraw->setFont($aTextValue['font_style']); $oDraw->setFontSize($aTextValue['font_size']); $oDraw->setFillColor($aTextValue['font_color']); $this->image->annotateImage($oDraw, $aTextValue['x'], $aTextValue['y'], $aTextValue['text_angle'], $aTextValue['text']); unset($oDraw); } if ($sError == 1) { exit("Unable to generate Image. Check \"setImage\" Properties"); }elseif ($sError == 2) { exit("Unable to generate Image. Check \"setText\" Properties"); } $this->image->setImageFormat("jpg"); return $this->image->writeImage($sImage); } } ?>
2,调用示例:
<?php //调用类文件 require_once "ImageModifier.class.php"; //示例 $oImageMagick = new ImageModifier('template.jpg'); // Image Template on which you have to manupulate $oImageMagick->setText("This is one", 350, 20, 22, "red"); $oImageMagick->setText("This is Two", 50, 50, 25, "blue","50"); $oImageMagick->setImage("brand.jpg", 160, 90, 0); $oImageMagick->setImage("tata.jpg", 160, 20); $newImagename = "mynewImage.jpg"; $oImageMagick->generateImage($newImagename); ?>
在php中实现序列化,可以把复杂的数据类型压缩到一个字符串中。
php中的序列化与反序列化函数,事下:
serialize() 把变量和它们的值编码成文本形式
unserialize() 恢复原先变量
先来看一个例子:
$stooges = array('Moe','Larry','Curly');
$new = serialize($stooges);
print_r($new);echo "<br />";
print_r(unserialize($new));
结果:
Array ( [0] => Moe [1] => Larry [2] => Curly )
当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:
$shopping = array('Poppy seed bagel' => 2,'Plain Bagel' =>1,'Lox' =>4);
echo '<a href="/blog_article/next/cart/.html'.urlencode(serialize($shopping)).'">next</a>';
margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unserialize()中的数据。
如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:
$new_cart = unserialize(stripslashes($cart)); //如果magic_quotes_gpc开启
$new_cart = unserialize($cart);
如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理:
$fp = fopen('/tmp/cart','w');
fputs($fp,addslashes(serialize($a)));
fclose($fp);
//如果magic_quotes_runtime开启
$new_cat = unserialize(stripslashes(file_get_contents('/tmp/cart')));
//如果magic_quotes_runtime关闭
$new_cat = unserialize(file_get_contents('/tmp/cart'));
在启用了magic_quotes_runtime的情况下,从数据库中读取序列化的数据也必须经过stripslashes()的处理,保存到数据库中的序列化数据必须要经过addslashes()的处理,以便能够适当地存储。
mysql_query("insert into cart(id,data) values(1,'".addslashes(serialize($cart))."')");
$rs = mysql_query('select data from cart where id=1');
$ob = mysql_fetch_object($rs);
//如果magic_quotes_runtime开启
$new_cart = unserialize(stripslashes($ob->data));
//如果magic_quotes_runtime关闭
$new_cart = unserialize($ob->data);
说明:
当对一个对象进行反序列化操作时,PHP会自动地调用其__wakeUp()方法。
如此,便使得对象能够重新建立起序列化时未能保留的各种状态,例如:数据库连接等。
有时需要对数组实现序列化,以实现数据传输的需要。
在php中进行序列化与反序列化,主要用到如下的二个函数:
serialize 将数组格式化成有序的字符串
unserialize 将数组还原成数组
1,PHP序列化数组的例子
//序列化数组
$test = array("a"=>0,"b"=>0,"c"=>0);
$test2 = '';
$test2=serialize($test);
echo $test2;
echo "<hr>";
print_r(unserialize($test2));
2,PHP序列化数组用途:
主要是处理数组传递,数组存库操作。
例如,有一个数组需要传递给下一个页面,如果不想使用seesion/cookie,则可以使用以上函数序列化之后进行传递,然后还原。
例如,如果做一个网址目录的程序,其中有个 评分,分为好评,中评,差评。
那么,数据库给该功能设计的字段就一个,类型是长字符型。将三个评论组合成数组:
'a' => 0, //好评0个
'b' => 0, //中评0个
'c' => 0 //差评0个
)
将其用serialize函数转换后就是:a:3:{s:1:"a";i:0;s:1:"b";i:0;s:1:"c";i:0;},然后存在数据库。
取出的时候别忘记用unserialize函数转换成数组使用。
数组的序列化经常会用到,建议大家牢固掌握,尤其是serialize、unserialize函数的用法,更要灵活掌握。