29
6

[转]imagemagick,MagickWand,php应用二–php合成多帧gif

原文: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 )

MagickWand For PHP 英文手册

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++)>

相关日志

当前没有评论!

第一个在本文留言。

发表评论

名字(必须)
邮箱(必须),(永不被公布)
网址(建议)

字体为 粗体 是必填项目,邮箱地址 永远不会 公布。

允许部分 HTML 代码:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
URLs(网站链接)必须完整有效 (比如: http://www.vpnall.com),所有标签都必须完整的关闭。

超出部分系统将会自动分段及换行。

请保证评论内容是与日志或 Blog 内容相关的,灌水、攻击性或不恰当的评论 可能 会被编辑或删除。