Image类的扩展,可编辑GIF动画图片,需要Magick支持.

  1. <?php
  2. /**
  3.  * 定义 Myclass_Magick
  4.  *
  5.  * MagicWand_Info :  
  6.  * ---------------------------
  7.  * ImageMagick 官网地址 [url]http://www.imagemagick.org/script/index.php[/url]
  8.  * MagickWand For PHP Manual [url]http://www.magickwand.org/[/url]
  9.  * MagickWand For PHP模块下载地址 [url]http://www.magickwand.org/download/php/[/url]
  10.  */
  11. class Myclass_Magick 
  12. {
  13.         function Myclass_Magick() {
  14.                 if( !function_exists('newmagickwand') ) {
  15.                         die('no MagickImage extends! ');
  16.                 }
  17.         }        
  18.         
  19.         /**
  20.          * 生成动态GIF
  21.          * 
  22.          * @param array  $fileName: 目标文件地址 
  23.          * @param int    $delay:    GIF帧过渡时间
  24.          * @param string $desName:  生成后的图像文件名
  25.          *
  26.          */
  27.          function createGif($fileName$delay=1, $desName='') {
  28.                  $desName = $this->getDesName($desName);
  29.                 $mw = NewMagickWand();
  30.                 for($i=0; $i<count($fileName);$i++) {
  31.                         $mwTemp = NewMagickWand();
  32.                         MagickReadImage($mwTemp,$fileName[$i]);
  33.                         MagickSetImageDelay($mwTemp,$delay*100);  //100=1秒
  34.                         MagickAddImage($mw,$mwTemp);
  35.                         DestroyMagickWand($mwTemp);
  36.                 }
  37.                 MagickSetFormat($mw,"gif");
  38.                 MagickWriteImages($mw,$desName,MagickTrue);
  39.                 $mw = DestroyMagickWand($mw);         
  40.                 return $desName;
  41.         }
  42.         
  43.         /**
  44.          * 缩放 动态GIF
  45.          * 
  46.          * @param string $fileName: 目标文件地址 
  47.          * @param int    $width:    生成后的图像宽度
  48.          * @param int    $height:        生成后的图像高度
  49.          * @param string $desName:  生成后的图像名称
  50.          *
  51.          */
  52.         function resizeGif($fileName$width$height$desName=''
  53.         {
  54.                  $desName = $this->getDesName($desName);
  55.                 $mw = NewMagickWand();
  56.                 MagickReadImage($mw,$fileName);
  57.                 MagickResetIterator($mw);
  58.                 //MagickNextImage($mw);
  59.                 do {
  60.                         $iw = MagickGetImageWidth($mw);
  61.                         $ih = MagickGetImageHeight($mw);
  62.                         $ratio = doubleval($iw) / doubleval($width);
  63.                         if ($height * $ratio < $ih) {
  64.                                 $ratio = doubleval($ih) / doubleval($height);
  65.                         } 
  66.                         $arrSize = arrayfloor($iw/$ratio), floor($ih/$ratio));
  67.                         MagickResizeImage($mw$arrSize[0], $arrSize[1], 1, 1);
  68.                 } while(MagickNextImage($mw));
  69.                 MagickSetFormat($mw,"gif");
  70.                 MagickWriteImages($mw$desName, true);
  71.                 DestroyMagickWand($mw);
  72.                 return $desName;        
  73.         }
  74.         
  75.         /**
  76.          * 向 动画GIF上写字
  77.          * 
  78.          * @param string $fileName: 目标文件地址 
  79.          * @param string $text:     要写的文字
  80.          * @param string $desName:  生成后的图像地址 
  81.          * @param array  $height:        文字的样式
  82.          *
  83.          */
  84.         function writeGif($fileName$text$desName=''$config='') {
  85.                  $desName = $this->getDesName($desName);
  86.                 $textAlign = array// 对齐方式
  87.                         0 => MW_ForgetGravity,
  88.                         1 => MW_NorthWestGravity,
  89.                         2 => MW_NorthGravity,
  90.                         3 => MW_NorthEastGravity, 
  91.                         4 => MW_WestGravity,
  92.                         5 => MW_CenterGravity,
  93.                         6 => MW_EastGravity,
  94.                         7 => MW_SouthWestGravity,
  95.                         8 => MW_SouthGravity,
  96.                         9 => MW_SouthEastGravity,
  97.                         10 => MW_StaticGravity,
  98.                 );        
  99.                 $textColor = "#FF0000";                                        // 字体颜色
  100.                 $textWidth = 120;                                                // 字体宽度
  101.                 $textSize  = 14;                                                // 字体大小
  102.                 $textFont = "simhei.ttf";
  103.                 $textAlpha = 1;
  104.                 $textAlignIndex = 1;
  105.                 $textString = iconv("gb2312""utf-8"$text);//如果你传入的是非UTF8中文,这里要转换
  106.                 $textName = $this->desName;
  107.                 if($config) {
  108.                         extract($config, EXTR_OVERWRITE);
  109.                 }
  110.                 $dwFont = NewDrawingWand();
  111.                 $fontColor = NewPixelWand($textColor);        
  112.                 DrawSetTextEncoding($dwFont"UTF-8");                //设定图像上文字的编码
  113.                 DrawSetFont($dwFont$textFont);                        //设定字体
  114.                 DrawSetFontWeight($dwFont$textWidth);                //设定字宽
  115.                 DrawSetFillColor($dwFont$fontColor);                //设定颜色
  116.                 DrawSetFontSize($dwFont$textSize);                //设定字体大小
  117.                 DrawSetGravity($dwFont$textAlignIndex);        //设定对齐方式
  118.                 DrawSetFillAlpha($dwFont$textAlpha);                //设置不透明度,1为完全不透明
  119.         
  120.                 $dwGif = NewMagickWand();
  121.                 MagickReadImage($dwGif$fileName);
  122.                 MagickResetIterator($dwGif);
  123.                 do {
  124.                         MagickAnnotateImage( $dwGif$dwFont, 1, 1, 0, $textString );
  125.                 } while(MagickNextImage($dwGif));
  126.                 MagickSetFormat($dwGif,"gif");
  127.                 MagickWriteImages($dwGif$desName, true);
  128.                 DestroyDrawingWand($dwFont);
  129.                 DestroyMagickWand($dwGif);
  130.                 return $desName;                
  131.         }
  132.         /**
  133.          * 向图像上写文字
  134.          * 
  135.          * @param array  $fileName: 目标文件地址 
  136.          * @param string $desName:  生成后的图像地址 
  137.          * @param array  $fontInfo1:文字的样式信息
  138.          * @param array  $fontInfo2:文字的样式信息
  139.          * @param int    $delay:    GIF帧过渡时间
  140.          *
  141.          */
  142.          function writeText2($fileName$desName=''$fontInfo1=''$fontInfo2=''$delay=1) {
  143.                  $desName = './temp/' . $this->getDesName($desName);
  144.                 $f1 = $this->writeText($fileName$fontInfo1);
  145.                 $f2 = $this->writeText($fileName$fontInfo2);
  146.                 // 再生成GIF
  147.                 $mwGif = NewMagickWand();
  148.                 $mw1 = NewMagickWand();
  149.                 $mw2 = NewMagickWand();
  150.                 MagickReadImage($mw1$f1);
  151.                 MagickReadImage($mw2$f2);
  152.                 MagickSetImageDelay($mw1,$delay*100);
  153.                 MagickAddImage($mwGif$mw1);
  154.                 MagickSetImageDelay($mw2,$delay*100);
  155.                 MagickAddImage($mwGif$mw2);
  156.                 DestroyMagickWand($mw1);
  157.                 DestroyMagickWand($mw2);
  158.                 MagickSetFormat($mwGif"gif");
  159.                 MagickWriteImages($mwGif$desName, MagickTrue);
  160.                 DestroyMagickWand($mwGif);        
  161.                 unlink($f1);        
  162.                 unlink($f2);
  163.                 return $desName;
  164.         }
  165.         /**
  166.          * 向单帧图像写字,为writeText服务
  167.          * 
  168.          * @param string $fileName: 目标文件地址 
  169.          * @param array  $config:   配置信息
  170.          *
  171.          */
  172.         function writeText($fileName$config='') {
  173.                 $textAlign = array// 对齐方式
  174.                         0 => MW_ForgetGravity,
  175.                         1 => MW_NorthWestGravity,
  176.                         2 => MW_NorthGravity,
  177.                         3 => MW_NorthEastGravity, 
  178.                         4 => MW_WestGravity,
  179.                         5 => MW_CenterGravity,
  180.                         6 => MW_EastGravity,
  181.                         7 => MW_SouthWestGravity,
  182.                         8 => MW_SouthGravity,
  183.                         9 => MW_SouthEastGravity,
  184.                         10 => MW_StaticGravity,
  185.                 );        
  186.                 $textColor = "#FF0000";                                        // 字体颜色
  187.                 $textWidth = 120;                                                // 字体宽度
  188.                 $textSize  = 14;                                                // 字体大小
  189.                 $textFont = "simhei.ttf";
  190.                 $textAlpha = 1;
  191.                 $textAlignIndex = 1;
  192.                 $textString = "测试";                                        //如果你传入的是非UTF8中文,这里要转换
  193.                 $textString = iconv("gb2312""utf-8"$textString);//如果你传入的是非UTF8中文,这里要转换
  194.                 $textStrokeColor = "#00FF00";
  195.                 $textStrokeWidth = 0;
  196.                 $textStrokeOpacity = 0.2;                
  197.                 $textX = 0;
  198.                 $textY = 0;
  199.         
  200.                 if($config) {
  201.                         extract($config, EXTR_OVERWRITE);
  202.                 }
  203.                 $dwFont = NewDrawingWand();
  204.                 $fontColor = NewPixelWand($textColor);        
  205.                 DrawSetTextEncoding($dwFont"UTF-8");                //设定图像上文字的编码
  206.                 DrawSetFont($dwFont$textFont);                        //设定字体
  207.                 DrawSetFontWeight($dwFont$textWidth);                //设定字宽
  208.                 DrawSetFillColor($dwFont$fontColor);                //设定颜色
  209.                 DrawSetFontSize($dwFont$textSize);                //设定字体大小
  210.                 DrawSetGravity($dwFont$textAlignIndex);        //设定对齐方式
  211.                 DrawSetFillAlpha($dwFont$textAlpha);                //设置不透明度,1为完全不透明
  212.         
  213.                 $strokeColor = NewPixelWand($textStrokeColor);//设定外边框的颜色
  214.                 DrawSetStrokeColor($dwFont$strokeColor);          //设定外边框的颜色
  215.                 DrawSetStrokeWidth($dwFont$textStrokeWidth);                        //设定外边框的宽度
  216.                 DrawSetStrokeOpacity($dwFont$textStrokeOpacity);                //设定外边框的不透明度
  217.                 $mw = NewMagickWand();
  218.                 MagickReadImage($mw$fileName);                
  219.                 MagickAnnotateImage($mw$dwFont$textX$textY, 0, $textString );
  220.                 $tempName = './temp/' . time() . rand(0,1000) . ".jpg";
  221.                 MagickSetFormat($mw"jpg");
  222.                 MagickWriteImage($mw$tempName);
  223.                 DestroyDrawingWand($dwFont);        
  224.                 DestroyMagickWand($mw);        
  225.                 return $tempName;
  226.         }
  227.         function getDesName($desName) {
  228.                  ifemptyempty($desName) ) {
  229.                         $desName = md5(time().rand(0,100)).'.gif'
  230.                 }
  231.                 else {
  232.                         ifstripos(strtolower($desName), '.gif') === false ) {
  233.                                 $desName .= ".gif";
  234.                         }
  235.                 }        
  236.                 return $desName;
  237.         }        
  238. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值