19 12
发新话题
打印

PHP图像处理--MagicWand生成缩略图(可加水印)

PHP图像处理--MagicWand生成缩略图(可加水印)

程序开发时经常会碰到用户上传图片生成小缩略图的需求,由于用户上传的图片长宽比例不一,按比例生成小图时如何整齐地显示在页面上成了问题。
考虑到图片要按比例缩放这是基本原则,显示的时候边缘补白会不会好些呢。如下:

图一 尺寸480x350


图二 尺寸270x360

如果我们设定生成图片尺寸为100x100,两张图片生成的小图如下:
  

这样的话,虽然原图一个长的一个宽的,但我们还是可以生成不变形的缩略图并整齐地显示在页面上。
原理:新建一个背景图,然后把原图等比例缩放到不超过背景尺寸居中放置,生成需要的统一尺寸的缩略图片显示在页面上。
一向喜欢简洁,这么处理功能简单的模块更偏向于使用函数而不是类。
PHP生成这样的小缩略图函数如下:

<?php
/***********************************************************

   * Author ziming(jorygong@gmail.com) 2007-11-17

   * 本函数从源文件取出图象,成比例缩小,输出指定长宽的图片到目的文件
   * 如果原图尺寸比指定尺寸小,周围补充背景色;
   * 源文件格式:gif,jpg,png
   * 目的文件格式:同源文件格式
   * $srcFile: 源文件 (*.jpg/*.gif/*.png)
   * $dstDir: 目标文件目录(相对于域名存储目录的相对目录)
   * $dstFilename: 目标文件名 (一定不能带扩展名,自动添加同源文件相同的扩展名)
   * $Width: 目标图片宽度
   * $Height: 目标图片高度
   * $bgcolor: 缩放后图片背景填充色
   * $watermark: 水印图片文件名,为空表示不添加水印
   * $position: 水印图片位置(1=左上角,2=右上角,3=左下角,4=右下角)
   * $padding: 水印图片距边缘距离
   * 成功时返回目标文件信息数组
   * return array("filename"=>图片路径和名称,"dirname"=>图片目录,"basename"=>图片名(包括扩展名),"extension"=>图片扩展名);
   * 失败时返回空数组return array();

************************************************************/

function resize_image($srcFile, $dstDir, $dstFilename, $Width, $Height, $bgcolor = "#FFFFFF", $watermark = "", $position = 4, $padding = 20)
{
   $return_info = array();
   if (!is_file($srcFile))
   {
     return $return_info;
   }
   $size = @getimagesize($srcFile);

   //尺寸
     $srcW = $size[0];
     $srcH = $size[1];
   $srcR = $srcW/$srcH;
   $dstR = $Width/$Height;
   if ($Width<=0 || $Height <=0)
   {
     $newW = $srcW; //新图片高度
     $newH = $srcH; //新图片宽度
   }
   else
   {
     if($Width > $srcW)
     {
       if ($Height > $srcH)
       {
         $newW = $srcW;
         $newH = $srcH;
       }
       else
       {
         $newH = $Height;
         $newW = round($newH*$srcR);
       }
     }
     else
     {
       if ($dstR > $srcR)
       {
         $newH = $Height;
         $newW = round($newH*$srcR);
       }
       else
       {
         $newW = $Width;
         $newH = round($newW/$srcR);
       }
     }
   }
   $newL = round(($Width-$newW)/2); //新图片左边距
   $newT = round(($Height-$newH)/2); //新图片顶边距
   if ($newL < 0)
   {
     $newL = 0;
   }
   if ($newT < 0)
   {
     $newT = 0;
   }

   //类型
   switch ($size[2])
   {
     case 1:
       $im = @imagecreatefromgif($srcFile);
       $extension .= "gif";
       break;
     case 2:
       $im = @imagecreatefromjpeg($srcFile);
       $extension .= "jpg";
       break;
     case 3:
       $im = @imagecreatefrompng($srcFile);
       $extension .= "png";
       break;
     default:
       return $ret_info;
   }

   //缩放原图并合并到背景图上
   $bgR = hexdec(substr($bgcolor,1,2));
   $bgG = hexdec(substr($bgcolor,3,2));
   $bgB = hexdec(substr($bgcolor,5,2));
   if(@function_exists("imagecopyresampled"))
   {
     $newim = @imagecreatetruecolor($Width, $Height);
     $back = @imagecolorallocate($newim, $bgR, $bgG, $bgB);
     @imagefilledrectangle($newim, 0, 0, $Width - 1, $Height - 1, $back);
     @imagecopyresampled($newim, $im, $newL, $newT, 0, 0, $newW, $newH, $srcW, $srcH);
   }
   else
   {
     $newim = imagecreate($Width, $Height);
     @imagecolorallocate($newim, $bgR, $bgG, $bgB);
     imagecopyresized($newim, $im, $newL, $newT, 0, 0, $newW, $newH, $srcW, $srcH);
   }

   //处理水印图
   if ($watermark)
   {
     $padding = intval($padding);
     $wmsize = @getimagesize($watermark);
     if ($wmsize)
     {
       if ($position == 1)
       {
         $wmL = $padding;
         $wmT = $padding;
       }
       elseif ($position == 2)
       {
         $wmL = $Width-$padding-$wmsize[0];
         $wmT = $padding;
       }
       elseif ($position == 3)
       {
         $wmL = $padding;        
         $wmT = $Height-$padding-$wmsize[1];
       }
       else
       {
         $wmL = $Width-$padding-$wmsize[0];
         $wmT = $Height-$padding-$wmsize[1];
       }
       switch ($wmsize[2])
       {
         case 1:
           $wim = @imagecreatefromgif($watermark);
           break;
         case 2:
           $im = @imagecreatefromjpeg($watermark);
           break;
         case 3:
           $im = @imagecreatefrompng($watermark);
           break;
         default:
           return $ret_info;
       }
       @imagecopy($newim, $wim, $wmL, $wmT, 0, 0, $wsize[0], $wsize[1]);
     }
   }

   $dstFilename .= ".".$extension;
   switch ($size[2])
   {
     case 1:
       imagegif($newim,$dstFilename);
       break;
     case 2:
       imagejpeg($newim,$dstFilename);   
       break;
     case 3:
       imagepng($newim,$dstFilename);   
       break;
   }

   $return_info["filename"] = $dstDir.$dstFilename;
   $return_info["dirname"] = $dstDir;
   $return_info["basename"] = $dstFilename;
   $return_info["extension"] = $extension;
   return $return_info;
}

?>水印图片建议使用PNG格式,可以透明生成的水印清晰度又高。
上面的函数要求PHP支持GD库并且存放缩略图的目标文件夹已经建立。
但使用GD库生成缩略图有个严重的问题,就是在处理有些手机或相机拍出的照片(暂且可以称这些照片为数据不完整或格式不符合标准图片)时会出现PHP占用内存超出服务器最大限制的现象,生成一张全黑的图片或直接失败。
好在有另外一个专业的图像处理工具ImageMagic可以使用,它的处理速度更快,并且一些不完整的图片也能轻松处理。
功能更完善的MagickWand缩略图生成函数如下:

<?php
/***********************************************************

   * Author ziming(jorygong@gmail.com) 2007-11-17

   * 本函数从源文件取出图象,成比例缩小,输出指定长宽的图片到目的文件
   * 如果原图尺寸比指定尺寸小,周围补充背景色;
   * 源文件格式:gif,jpg,png
   * 目的文件格式:同源文件格式
   * $srcFile: 源文件 (*.jpg/*.gif/*.png)
   * $dstDir: 目标文件目录(相对于域名存储目录的相对目录)
   * $dstFilename: 目标文件名 (一定不能带扩展名,自动添加同源文件相同的扩展名)
   * $Width: 目标图片宽度
   * $Height: 目标图片高度
   * $bgcolor: 缩放后图片背景填充色
   * $watermark: 水印图片文件名,为空表示不添加水印
   * $position: 水印图片位置(1=左上角,2=右上角,3=左下角,4=右下角)
   * $padding: 水印图片距边缘距离
   * 成功时返回目标文件信息数组
   * return array("filename"=>图片路径和名称,"dirname"=>图片目录,"basename"=>图片名(包括扩展名),"extension"=>图片扩展名);
   * 失败时返回空数组return array();

************************************************************/
hehe

TOP

function resize_image($srcFile, $dstDir, $dstFilename, $Width, $Height, $bgcolor = "#FFFFFF", $watermark = "", $position = 4, $padding = 20)
{
   $return_info = array();
   if (!is_file($srcFile))
   {
     return $return_info;
   }
   $mymagickwand = NewMagickWand();
   if (!MagickReadImage($mymagickwand, $srcFile))
   {
     return $return_info;
   }

   //尺寸
   $srcW = MagickGetImageWidth($mymagickwand);
     $srcH = MagickGetImageHeight($mymagickwand);
   $srcR = $srcW/$srcH;
   $dstR = $Width/$Height;
   if ($Width<=0 || $Height <=0)
   {
     $newW = $srcW; //新图片高度
     $newH = $srcH; //新图片宽度
   }
   else
   {
     if($Width > $srcW)
     {
       if ($Height > $srcH)
       {
         $newW = $srcW;
         $newH = $srcH;
       }
       else
       {
         $newH = $Height;
         $newW = round($newH*$srcR);
       }
     }
     else
     {
       if ($dstR > $srcR)
       {
         $newH = $Height;
         $newW = round($newH*$srcR);
       }
       else
       {
         $newW = $Width;
         $newH = round($newW/$srcR);
       }
     }
   }
   $newL = round(($Width-$newW)/2); //新图片左边距
   $newT = round(($Height-$newH)/2); //新图片顶边距
   if ($newL < 0)
   {
     $newL = 0;
   }
   if ($newT < 0)
   {
     $newT = 0;
   }

   //类型
   $srcT = MagickGetImageFormat($mymagickwand);
   if ($srcT == "JPEG")
   {
     $extension = "jpg";
   }
   elseif ($srcT == "GIF")
   {
     $extension = "gif";
   }
   elseif ($srcT == "PNG")
   {
     $extension = "png";
   }
   else
   {
     return $return_info;
   }

   //生成背景图
   $bgmagickwand = NewMagickWand();
   MagickNewImage($bgmagickwand,$Width,$Height,$bgcolor);
   MagickSetFormat($bgmagickwand,$srcT);

   //缩放原图并合并到背景图上
   MagickScaleImage($mymagickwand, $newW, $newH);
   MagickCompositeImage($bgmagickwand, $mymagickwand, MW_OverCompositeOp, $newL, $newT);

   //处理水印图
   if ($watermark && is_file($watermark))
   {
     MagickRemoveImage($mymagickwand);
     $padding = intval($padding);
     if (MagickReadImage($mymagickwand, $watermark))
     {
       if ($position == 1)
       {
         $wmL = $padding;
         $wmT = $padding;
       }
       elseif ($position == 2)
       {
         $wmL = $Width-$padding-MagickGetImageWidth($mymagickwand);
         $wmT = $padding;
       }
       elseif ($position == 3)
       {
         $wmL = $padding;        
         $wmT = $Height-$padding-MagickGetImageHeight($mymagickwand);
       }
       else
       {
         $wmL = $Width-$padding-MagickGetImageWidth($mymagickwand);
         $wmT = $Height-$padding-MagickGetImageHeight($mymagickwand);
       }
       MagickCompositeImage($bgmagickwand, $mymagickwand, MW_OverCompositeOp, $wmL,$wmT);
     }
   }

   $dstFilename .= ".".$extension;
   MagickWriteImage($bgmagickwand, $dstFilename);
   DestroyMagickWand($mymagickwand);
   DestroyMagickWand($bgmagickwand);

   $return_info["filename"] = $dstDir.$dstFilename;
   $return_info["dirname"] = $dstDir;
   $return_info["basename"] = $dstFilename;
   $return_info["extension"] = $extension;
   return $return_info;
}

?>
就像现在的PhilipDVD机一样,什么破碟烂碟盗版碟都能读取,超强纠错。
使用此函数生成的缩略图图像不变形,并且长和宽都是指定大小,再不会因为缩略图和原图长宽比例相同而各个缩略图的长宽比例不同使网页凌乱了。
PHP图像处理--MagicWand生成缩略图源码下载: 下载文件 (已下载 9 次)点击这里下载文件: function_img.rar

既然讲到MagicWand就顺便把Windows下PHP5的MagicWand扩展库加载也说一下吧:
1、下载dll文件,放到PHP的extension_dir目录里。
下载文件 (已下载 6 次)点击这里下载文件: magickwand_php5_dll.rar
2、打开PHP5的配置文件,添加以下三行内容。

extension=php_magickwand_dyn.dll
extension=php_magickwand_q8_st.dll
extension=php_magickwand_q16_st.dll
3、保存后重新启动Apache服务器。
hehe

TOP

Wow Gold Farming Strategies by Games

You will get the dough but after a bit of elbow-grease i.e. hard work, time, dedication and determination are the most important things to succeed in gold making using cheap wow gold making strategies.

If you want more wow gold
strategies, I highly recommend Valkor?s Gold Making Guide where all the buy wow gold secrets are revealed.

Farming which is actually killing respawning monsters constantly to obtain items you are later sell is one of the favorable strategies to make gold. But,WOW Power Leveling
it does require some time. If time is there with you and fate is your friend, then you can succeed in this for sure. Winter Spring is a place where success beckoned people. sell wow gold
工资真的要涨了
心里更加爱党了
能给孩子奖赏了
见到老婆敢嚷了
敢尝海鲜鹅掌了
闲时能逛商场了
遇见美女心痒了
结果物价又涨了
一切都又白想了
go to buy cheap wow gold

TOP

TOP

SMT专家论坛

楼主说得不错。顶一下,有空到这个坛子看看
SMT论坛  。
SMT平价商城

TOP

TOP

TOP

陕西洋县中学校长及书记因替考事件被停职检查 -替考

新华网西安6月16日电(记者杨一苗、陈昌奇)陕西省洋县县委及县政府16日下午作出决定,代考事件的责任人洋县中学校长李鹏云、党支部书记聂文锋停职检查。

  在6月7日进行的高考中,监考人员在洋县城关中学及洋县中学考点查出4名代考考生,并立即取消其考试资格。随后汉中市及洋县教育、监察、公安部门组成联合调查组,对替考事件进行查处。
新华网西安6月15日电(记者 杨一苗 陈昌奇)陕西省洋县在今年高考中发生多起高考代考事件,15日当地有关部门对其中一起事件进行了处理,洋县智果中学政教主任及一名高三年级班主任受到警告处分。

  在6月7日进行的高考中,监考人员在陕西省洋县的城关中学及洋县中学考点查出4名代考考生,并立即取消其考试资格。随后汉中市及洋县的教育、监察、公安部门组成联合调查组,对此次替考事件进行查处。

  调查认定,洋县社会青年韩某在网上聊天时结识洋县中学高二学生吴某,两人遂商议由吴某替韩某参加高考。随后韩某将吴某的照片及相关证件交给曾任自己班主任的智果中学政教主任牛某,牛某安排高三年级班主任吕某为其办理报考手续。吕某为其填写了政审表、体检表和准考证,并在韩某的表格上贴了吴某的照片,同本班学生的报考档案一并上报到洋县招生办。6月7日上午,在洋县中学第17考场参加考试的该校高二学生吴某被洋县中学教师认出,随后被带至考务办公室,经询问吴某承认了代考代替韩某考试的违纪事实。


  经调查,除一例替考事件为当事人与替考人私下商议外,另外三例中替考人和被替考人的身份证、户口本、学历证明全是伪造的,其介绍人秦某以及替考和被替考的6人,公安机关目前正在查找。

  除李鹏云、聂文锋被停职检查外,有关部门对涉嫌替考案件的洋县中学教导主任、高中三年级组长梁杰、洋县医院医生常某实施“双规”,进一步调查取证。对其他三例替考与被替考人员涉及的有关责任问题,由教育、监察、公安等部门组成的联合调查组进一步查处。(完)

TOP

当胯下的怪兽能够撼山穿岭

当生死相伴的日立空调维修女友不需要倾诉衷肠,便对你适时的志高空调特约维修宽衣解带时,你会任其俘虏,还是办公楼装修略有反抗?!当胯下的怪兽能够撼山穿岭,而又唯你是从管道疏通的时候,你会与它并驾齐驱,还是坐享日立空调特约维修其成

TOP

[外国小说]一个狗娘养的自白

我竟然敢称自己是婊子养的,胆子真是大啊!

      已经去世的母亲、父亲会怎么想呢?

      我想他们一定会哈哈大笑,一定会很欣赏我这么做,尤其是我的母亲。

      她是个特立独行的女人人体艺术早早就守了寡,并且自己一个人把两个儿子拉扯大。她以自己的方式与残酷的现实生活搏斗,并且让我制订自己的规则,走自己的路。

      还是小孩子的时候,我就是个制造恶作剧的高手,长大成人以后,我是胡闹与马基雅维利主义的混合物。

      作为《今日美国》的创始人和加内特总公司的首席执行官,我成为众人眼中行为乖僻的媒体大鳄。

      人们经常称我为“婊子养的人体艺术有些人当着我的面这么骂,一边骂还一边微笑。另外一些人则背着我骂,一边骂一边傻笑。

      他们的意思无非有两种:一是我成为他们的肉中刺、眼中钉,整天让他们屁股疼;二是我赢得了他们的赞赏、喜欢甚至嫉妒。

      在今日世界里人体艺术被人称作“婊子养的”并不是件坏事,因为它已经被赋予了多种意思,你想怎么理解就可以怎么去理解。字典里对它的解释要么含混不清要么有很多种,或者根本就没有这个词。

      “婊子养的”全称是贱女人之子,1712年在英国有定义。那是个不雅的词,影射一个人的母亲行为不轨。

      但是,“婊子养的人体艺术却与贱女人之子没有任何关系。

      在我的书中,“婊子养的”这个词指利用一切技巧完成一个任务,或者爬到顶层的人,尽可能冠冕堂皇,必要的时候也来点下作手段。

      要让这个世界转动下去,需要各种各样的“婊子养的”。大部分这样的人都是可爱的,许多人介乎两者之间,还有一些人是坏蛋。

      大家读《一个婊子养的自白》这本书的时候,应该能够判断出这一称号对我适用与否,也应该能够判断出这个词是否适合你的朋友和敌人──甚至是否适合你自己。

      只要你带着微笑,你可以称任何人是“婊子养的”。

      奶油和婊子养的都会浮到顶层

      艾伦是个可爱的小婊子养的。

      ──我的两位前妻

      圣诞节到了,是好好快乐一把的日子。

      时值1982年12月,对我创办才3个月的全国性报纸《今日美国》来说,那却是斗争和挣扎的季节。

      我按自己的方式向人们送去季节的问候。

      给家人和朋友寄去充满温情和挚爱的贺卡,或者打类似的电话,对事业上的伙伴表达真挚的感谢并送上节日的良好祝愿。

      以下这些特别成人小说话语是送给我的两位关键同仁约翰·克雷和约翰·奎因的:

      这里到底谁他妈说了算?

      一切都得由我亲自动手吗?

      今天早晨的《今日美国》第一版真他妈臭极了。

      故事枯燥!愚蠢的编辑!

      1、头版新闻没有能抓住读者的真家伙。

TOP

不经意



走过路过看贴拿米走人~~~

我的链接:网站推广
网站优化方案
大型网站咨询
企业网站优化
搜索引擎

TOP

排名9

据资料调查显示:国外客户在寻找贸易合作伙伴的方式上,使用最多的是搜索引擎。而Google是目前世界范围内最受欢迎基于全文检索的搜索引擎,每天处理的搜索请求高达2.0亿次!并且为Yahoo!、AOL等世界著名的门户提供后台搜索服务。国外知名搜索引擎有aol(美国在线)、infoseek、netscape、exite,它们的搜索结果也是引用google的,只要做了google左侧排名,在这些搜索引擎上都有同样靠前。
Google左侧排名的最大优势在于:网站推广工具网站推广策略网站推广方式搜索引擎优化[url=http://www.jingke.org/bjqywztgff.htm]北京企业网站推广方法[/url

TOP

吐血支持

在下对你的景仰之情传奇世界私服有如滔滔长江之水,连绵不绝…… 又如黄河泛滥,一发不可收拾…… 嘿嘿...惊天地!泣鬼神!感人肺腑!感人落泪!i 服了 u!长江后浪runescape退前浪,灌水英雄代代出..........好贴...又见好帖...又见不是一般的好贴...好贴征途私服 不是别的...好贴就是好贴...好是好贴的好...贴是好贴的帖...好贴不是别的...好贴就是好贴...曾经有人问我...楼猪的帖子算不算好贴...我没有回答...因为我想起了完美世界私服 一位传说中的大师---古龙先生的一段话:“...天涯远不远?...天涯其实一点也不远...因为人已经在天涯...天涯还远吗...”好帖啊...难得一见的好贴...楼猪的文章简直是惊天地...泣鬼神...图文并茂...嬉笑怒骂...指点系词...激扬文字...带给我们的仅仅是视觉上的感受吗...大错特错...楼猪的文章带给我们的是心灵深处的震撼...楼猪的文章是宣言书...楼猪的文章梦幻西游私服是宣传队...楼猪的文章是播种机...楼猪的文章带来的是读者的欣喜和系词的繁荣.我对楼猪的景仰犹如滔滔江水绵绵不绝...又如黄河泛滥一发而不可收拾...楼主的文笔实在用笔墨难以形容...熄了灯...打着赤脚...将整个人都倦在大班椅里...喝着清茶看那一个个帖子在mop之间时隐时现...

TOP

肥肉网友情连接1

TOP

北京盛世乐章景观照明工程技术有限公司4

伴随照明科技的不断发展,城市夜景亮化工程喷泉、大型主题乐园置景及文艺演出等对灯光产品的性能及功能也日益提出更高的要求音乐喷泉。为了适应新的市场形势,我们对世界几乎所有同类灯光产品进行对比研究以后,音乐喷泉认定一系列适合中国市场的代表性产品加以重点推广。
    包括建筑泛光照明音乐喷泉,大功率户外光束投射灯及各类激光产品。这些产品的魅力不在于它们本身,而在于他们综合运用之后能够使灯光设计师细腻的创作构思得以充分体现。我们更有一批专业工程技术人员,在技术支持及工程设计方面提供一丝不苟的服务。喷泉方兴未艾的亮化照明市场前景广阔,而我们对光明的追求也永无止境

TOP

 19 12
发新话题