原文:http://www.only4.cn/archives/109
上一篇已经介绍了imagemagick,
下面来说下imagemagick对php的组件MagickWand
利用MagickWand和php就可以实现gd中不能处理多帧的gif.
获取MagickWand
http://www.magickwand.org/download/php/
MagickWand For PHP 5.2.4 ( Win32 DLL )
MagickWand For PHP 5.2.0 ( Win32 DLL )
MagickWand For PHP 4.4.8 ( Win32 DLL )
MagickWand For PHP 4.3.11 ( Win32 DLL )
ImageMagick-6.4.0-4.tar.gz ( Install from Unix Source )
MagickWandForPHP-1.0.7.tar.gz ( Install from Unix Source )
win下就不要编译吧 直接用dll
注意这个dll在5.20版本其他版本不一定能用
linux 下
Ubuntu下做测试
1、先安装 ImageMagick 软件包:
sudo apt-get install imagemagick libmagick9-dev
2、安装以下编译需要的软件包:
sudo apt-get install build-essential
sudo apt-get install php5-dev
3、找一个目录,下载 PHP 的源代码(我使用的是 PHP5):
sudo apt-get source php5
这时候,会将 PHP5 的源代码解压缩到当前目录下,进入该目录下的 ext/ 子目录:
cd php5-5.1.6/ext
4、下载并解压缩 MagickWand 代码包:
wget http://www.magickwand.org/download/php/magickwand-0.1.8.tar.bz2
tar -jxvf magickwand-0.1.8.tar.bz2
cd magickwand
magickwand$ phpize5
./configure
make
sudo make install
5、在你的 php.ini 文件中设置:
extension=magickwand.so
安装好了之后看看phpiinfo有magickwand就是成功了
实例:
(这个类大多处理已经做了说明,给多帧gif加水印不再困难了)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | getDesName($desName); $mw = NewMagickWand(); for($i=0; $i<count($filename);$i++) {="" $mwtemp="NewMagickWand();" magickreadimage($mwtemp,$filename[$i]);="" magicksetimagedelay($mwtemp,$delay*100);="" 100="1秒" magickaddimage($mw,$mwtemp);="" destroymagickwand($mwtemp);="" }="" magicksetformat($mw,"gif");="" magickwriteimages($mw,$desname,magicktrue);="" $mw="DestroyMagickWand($mw);" return="" $desname;="" **="" *="" 缩放="" 动态gif="" @param="" string="" $filename:="" 目标文件地址="" int="" $width:="" 生成后的图像宽度="" $height:="" 生成后的图像高度="" $desname:="" 生成后的图像名称="" function="" resizegif($filename,="" $width,="" $height,="" $desname="" )="">getDesName($desName); $mw = NewMagickWand(); MagickReadImage($mw,$fileName); MagickResetIterator($mw); //MagickNextImage($mw); do { $iw = MagickGetImageWidth($mw); $ih = MagickGetImageHeight($mw); $ratio = doubleval($iw) / doubleval($width); if ($height * $ratio < $ih) { $ratio = doubleval($ih) / doubleval($height); } $arrSize = array( floor($iw/$ratio), floor($ih/$ratio)); MagickResizeImage($mw, $arrSize[0], $arrSize[1], 1, 1); } while(MagickNextImage($mw)); MagickSetFormat($mw,"gif"); MagickWriteImages($mw, $desName, true); DestroyMagickWand($mw); return $desName; } /** * 向 动画GIF上写字 * * @param string $fileName: 目标文件地址 * @param string $text: 要写的文字 * @param string $desName: 生成后的图像地址 * @param array $height: 文字的样式 * */ function writeGif($fileName, $text, $desName='', $config='') { $desName = $this->getDesName($desName); $textAlign = array( // 对齐方式 0 => MW_ForgetGravity, 1 => MW_NorthWestGravity, 2 => MW_NorthGravity, 3 => MW_NorthEastGravity, 4 => MW_WestGravity, 5 => MW_CenterGravity, 6 => MW_EastGravity, 7 => MW_SouthWestGravity, 8 => MW_SouthGravity, 9 => MW_SouthEastGravity, 10 => MW_StaticGravity, ); $textColor = "#FF0000"; // 字体颜色 $textWidth = 120; // 字体宽度 $textSize = 14; // 字体大小 $textFont = "simhei.ttf"; $textAlpha = 1; $textAlignIndex = 1; $textString = iconv("gb2312", "utf-8", $text);//如果你传入的是非UTF8中文,这里要转换 $textName = $this->desName; if($config) { extract($config, EXTR_OVERWRITE); } $dwFont = NewDrawingWand(); $fontColor = NewPixelWand($textColor); DrawSetTextEncoding($dwFont, "UTF-8"); //设定图像上文字的编码 DrawSetFont($dwFont, $textFont); //设定字体 DrawSetFontWeight($dwFont, $textWidth); //设定字宽 DrawSetFillColor($dwFont, $fontColor); //设定颜色 DrawSetFontSize($dwFont, $textSize); //设定字体大小 DrawSetGravity($dwFont, $textAlignIndex); //设定对齐方式 DrawSetFillAlpha($dwFont, $textAlpha); //设置不透明度,1为完全不透明 $dwGif = NewMagickWand(); MagickReadImage($dwGif, $fileName); MagickResetIterator($dwGif); do { MagickAnnotateImage( $dwGif, $dwFont, 1, 1, 0, $textString ); } while(MagickNextImage($dwGif)); MagickSetFormat($dwGif,"gif"); MagickWriteImages($dwGif, $desName, true); DestroyDrawingWand($dwFont); DestroyMagickWand($dwGif); return $desName; } /** * 向图像上写文字 * * @param array $fileName: 目标文件地址 * @param string $desName: 生成后的图像地址 * @param array $fontInfo1:文字的样式信息 * @param array $fontInfo2:文字的样式信息 * @param int $delay: GIF帧过渡时间 * */ function writeText2($fileName, $desName='', $fontInfo1='', $fontInfo2='', $delay=1) { $desName = './temp/' . $this->getDesName($desName); $f1 = $this->writeText($fileName, $fontInfo1); $f2 = $this->writeText($fileName, $fontInfo2); // 再生成GIF $mwGif = NewMagickWand(); $mw1 = NewMagickWand(); $mw2 = NewMagickWand(); MagickReadImage($mw1, $f1); MagickReadImage($mw2, $f2); MagickSetImageDelay($mw1,$delay*100); MagickAddImage($mwGif, $mw1); MagickSetImageDelay($mw2,$delay*100); MagickAddImage($mwGif, $mw2); DestroyMagickWand($mw1); DestroyMagickWand($mw2); MagickSetFormat($mwGif, "gif"); MagickWriteImages($mwGif, $desName, MagickTrue); DestroyMagickWand($mwGif); unlink($f1); unlink($f2); return $desName; } /** * 向单帧图像写字,为writeText服务 * * @param string $fileName: 目标文件地址 * @param array $config: 配置信息 * */ function writeText($fileName, $config='') { $textAlign = array( // 对齐方式 0 => MW_ForgetGravity, 1 => MW_NorthWestGravity, 2 => MW_NorthGravity, 3 => MW_NorthEastGravity, 4 => MW_WestGravity, 5 => MW_CenterGravity, 6 => MW_EastGravity, 7 => MW_SouthWestGravity, 8 => MW_SouthGravity, 9 => MW_SouthEastGravity, 10 => MW_StaticGravity, ); $textColor = "#FF0000"; // 字体颜色 $textWidth = 120; // 字体宽度 $textSize = 14; // 字体大小 $textFont = "simhei.ttf"; $textAlpha = 1; $textAlignIndex = 1; $textString = "测试"; //如果你传入的是非UTF8中文,这里要转换 $textString = iconv("gb2312", "utf-8", $textString);//如果你传入的是非UTF8中文,这里要转换 $textStrokeColor = "#00FF00"; $textStrokeWidth = 0; $textStrokeOpacity = 0.2; $textX = 0; $textY = 0; if($config) { extract($config, EXTR_OVERWRITE); } $dwFont = NewDrawingWand(); $fontColor = NewPixelWand($textColor); DrawSetTextEncoding($dwFont, "UTF-8"); //设定图像上文字的编码 DrawSetFont($dwFont, $textFont); //设定字体 DrawSetFontWeight($dwFont, $textWidth); //设定字宽 DrawSetFillColor($dwFont, $fontColor); //设定颜色 DrawSetFontSize($dwFont, $textSize); //设定字体大小 DrawSetGravity($dwFont, $textAlignIndex); //设定对齐方式 DrawSetFillAlpha($dwFont, $textAlpha); //设置不透明度,1为完全不透明 $strokeColor = NewPixelWand($textStrokeColor);//设定外边框的颜色 DrawSetStrokeColor($dwFont, $strokeColor); //设定外边框的颜色 DrawSetStrokeWidth($dwFont, $textStrokeWidth); //设定外边框的宽度 DrawSetStrokeOpacity($dwFont, $textStrokeOpacity); //设定外边框的不透明度 $mw = NewMagickWand(); MagickReadImage($mw, $fileName); MagickAnnotateImage($mw, $dwFont, $textX, $textY, 0, $textString ); $tempName = './temp/' . time() . rand(0,1000) . ".jpg"; MagickSetFormat($mw, "jpg"); MagickWriteImage($mw, $tempName); DestroyDrawingWand($dwFont); DestroyMagickWand($mw); return $tempName; } function getDesName($desName) { if( empty($desName) ) { $desName = md5(time().rand(0,100)).'.gif'; } else { if( stripos(strtolower($desName), '.gif') === false ) { $desName .= ".gif"; } } return $desName; } } ?> </count($filename);$i++)> |
当前没有评论!
第一个在本文留言。