PageRenderTime 48ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/b2b/core/model/utility/mdl.magickwand.php

http://phpfor.googlecode.com/
PHP | 438 lines | 286 code | 70 blank | 82 comment | 30 complexity | 32e7d7577c268c4b2713347c59700e02 MD5 | raw file
  1. <?php
  2. /**
  3. * mdl_magickwand
  4. *
  5. * @package
  6. * @version $Id: mdl.magickwand.php 1867 2008-04-23 04:00:24Z hujianxin $
  7. * @copyright 2003-2007 ShopEx
  8. * @author hujianxin <hjx@shopex.cn>
  9. * @license Commercial
  10. */
  11. class mdl_magickwand{
  12. var $src_image_name = ""; //????????(???????)
  13. var $jpeg_quality = 90; //jpeg????
  14. var $save_file = ''; //????????????????????
  15. var $wm_image_name = ""; //????????(???????)
  16. var $magickwand_loaded = false; //magickwand????
  17. var $wm_image_pos = 1; //?????????
  18. // 0 = middle
  19. // 1 = top left
  20. // 2 = top right
  21. // 3 = bottom right
  22. // 4 = bottom left
  23. // 5 = top middle
  24. // 6 = middle right
  25. // 7 = bottom middle
  26. // 8 = middle left
  27. var $wm_image_transition = 80; //???????????? (1=100)
  28. var $emboss = false;
  29. var $wm_text = ""; //????(?????????\r\n?????)
  30. var $wm_text_size = 20; //??????
  31. var $wm_text_angle = 4; //??????,?????????
  32. var $wm_text_font = ""; //???????
  33. var $wm_text_color = "#FF0000"; //????????
  34. var $wm_angle;
  35. /*******************
  36. * ????
  37. **********************/
  38. function mdl_magickwand()
  39. {
  40. if(function_exists("NewMagickWand")) $this->magickwand_loaded = true;
  41. }
  42. function fileCheck(){
  43. $font_dir = PUBLIC_DIR.'/fonts/';
  44. if(!is_file($this->wm_image_name)) $this->wm_image_name='';
  45. if(!is_file($font_dir.$this->wm_text_font)) $this->wm_text='';
  46. else $this->wm_text_font = $font_dir.$this->wm_text_font;
  47. }
  48. /************************************************
  49. /*
  50. makeWaterMark ?????
  51. ????
  52. ********************************************************/
  53. function makeWaterMark()
  54. {
  55. $this->fileCheck();
  56. $image_info = $this->getInfo($this->src_image_name);
  57. if (!$image_info) return false;
  58. $src_image_type = $image_info["type"];
  59. $src_image = $this->createWaterMark();
  60. $this->savefile($src_image_type,$src_image);
  61. ClearMagickWand($src_image);
  62. return true;
  63. }
  64. /************************************************
  65. /*
  66. makeThumb ?????
  67. ????
  68. $width ????? $height ?????
  69. ********************************************************/
  70. function makeThumb($objWidth=128, $objHeight=128)
  71. {
  72. $image_info = $this->getInfo($this->src_image_name);
  73. if (!$image_info) return false;
  74. $src_image_type = $image_info["type"];
  75. $res = $this->createThumb($objWidth,$objHeight);
  76. //*/
  77. $this->savefile($src_image_type,$res);
  78. ClearMagickWand($res);
  79. return true;
  80. }
  81. function makeThumbWatermark($objWidth=128,$objHeight=128)
  82. {
  83. $this->fileCheck();
  84. $image_info = $this->getInfo($this->src_image_name);
  85. if (!$image_info) return false;
  86. $src_image_type = $image_info["type"];
  87. $objWidth = ($objWidth==0)?$image_info["width"]:$objWidth;
  88. $objHeight = ($objHeight==0)?$image_info["height"]:$objHeight;
  89. $objWidth = ($objWidth > $image_info["width"]) ? $image_info["width"] : $objWidth;
  90. $objHeight = ($objHeight > $image_info["height"]) ? $image_info["height"] : $objHeight;
  91. $thumb = $this->createThumb($objWidth,$objHeight);
  92. $thumbwm = $this->createWaterMark($thumb);
  93. $this->savefile($src_image_type,$thumbwm);
  94. ClearMagickWand($thumbwm);
  95. return true;
  96. }
  97. /************************************************
  98. /*
  99. createWaterMark ????????MagickWand resource
  100. ????
  101. ********************************************************/
  102. function createWaterMark($src_image=""){
  103. if(!IsMagickWand($src_image))
  104. {
  105. $src_image = NewMagickWand();
  106. MagickReadImage($src_image, $this->src_image_name);
  107. }
  108. if (!$src_image) return false;
  109. $src_image_w=MagickGetImageWidth($src_image);
  110. $src_image_h=MagickGetImageHeight($src_image);
  111. if ($this->wm_image_name){
  112. $wm_image_info = $this->getInfo($this->wm_image_name);
  113. if (!$wm_image_info) return false;
  114. $wm_image = NewMagickWand();
  115. MagickReadImage($wm_image, $this->wm_image_name);
  116. $wm_image_w=MagickGetImageWidth($wm_image);
  117. $wm_image_h=MagickGetImageHeight($wm_image);
  118. $temp_wm_image = $this->getPos($src_image_w,$src_image_h,$this->wm_image_pos,$wm_image);
  119. $wm_image_x = $temp_wm_image["dest_x"];
  120. $wm_image_y = $temp_wm_image["dest_y"];
  121. $opacity0 = MagickGetQuantumRange();
  122. $opacity100 = 0;
  123. $opacitypercent = $this->wm_image_transition;
  124. $opacity = $opacity0 - ($opacity0 * $opacitypercent/100 ) ;
  125. if ($opacity > $opacity0){
  126. $opacity = $opacity0;
  127. }elseif ($opacity <0){
  128. $opacity = 0;
  129. }
  130. MagickSetImageIndex($wm_image, 0);
  131. MagickSetImageType($wm_image, MW_TrueColorMatteType);
  132. MagickEvaluateImage($wm_image, MW_SubtractEvaluateOperator, $opacity, MW_OpacityChannel);
  133. MagickCompositeImage($src_image, $wm_image, MW_OverCompositeOp, $wm_image_x, $wm_image_y);
  134. }
  135. if ($this->wm_text){
  136. $this->wm_text = $this->wm_text;
  137. $temp_wm_text = $this->getPos($src_image_w,$src_image_h,$this->wm_image_pos);
  138. $wm_text_x = $temp_wm_text["dest_x"];
  139. $wm_text_y = $temp_wm_text["dest_y"];
  140. $drawing_wand=NewDrawingWand();
  141. if($this->wm_text_font != "")
  142. {
  143. DrawSetFont($drawing_wand,$this->wm_text_font);
  144. }
  145. DrawSetFontSize($drawing_wand,$this->wm_text_size);
  146. switch($this->wm_image_pos)
  147. {
  148. case 0:
  149. DrawSetGravity($drawing_wand,MW_CenterGravity);
  150. break;
  151. case 1:
  152. DrawSetGravity($drawing_wand,MW_NorthWestGravity);
  153. break;
  154. case 2:
  155. DrawSetGravity($drawing_wand,MW_NorthEastGravity);
  156. break;
  157. case 3:
  158. DrawSetGravity($drawing_wand,MW_SouthEastGravity);
  159. break;
  160. case 4:
  161. DrawSetGravity($drawing_wand,MW_SouthWestGravity);
  162. break;
  163. case 5:
  164. DrawSetGravity($drawing_wand,MW_NorthGravity);
  165. break;
  166. case 6:
  167. DrawSetGravity($drawing_wand,MW_EastGravity);
  168. break;
  169. case 7:
  170. DrawSetGravity($drawing_wand,MW_SouthGravity);
  171. break;
  172. case 8:
  173. DrawSetGravity($drawing_wand,MW_WestGravity);
  174. break;
  175. default:
  176. DrawSetGravity($drawing_wand,MW_CenterGravity);
  177. break;
  178. }
  179. $pixel_wand=NewPixelWand();
  180. if(preg_match("/([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])/i", $this->wm_text_color, $color))
  181. {
  182. $red = hexdec($color[1]);
  183. $green = hexdec($color[2]);
  184. $blue = hexdec($color[3]);
  185. PixelSetColor($pixel_wand,"rgb($red,$green,$blue)");
  186. }else{
  187. PixelSetColor($pixel_wand,"rgb(255,255,255)");
  188. }
  189. DrawSetFillColor($drawing_wand,$pixel_wand);
  190. MagickAnnotateImage($src_image,$drawing_wand,0,0,$this->wm_angle,$this->wm_text);
  191. }
  192. return $src_image;
  193. }
  194. /************************************************
  195. /*
  196. createThumb ????????MagickWand resource
  197. ????
  198. $objWidth ?????
  199. $objHeight ?????
  200. ********************************************************/
  201. function createThumb($objWidth,$objHeight,$nmw="")
  202. {
  203. $srcImage = $this->src_image_name;
  204. if(!IsMagickWand($nmw))
  205. {
  206. $nmw = NewMagickWand();
  207. MagickReadImage($nmw, $srcImage);
  208. }
  209. $srcImageWidth = MagickGetImageWidth($nmw);
  210. $srcImageHeight = MagickGetImageHeight($nmw);
  211. if($objWidth == 0 || $objHeight == 0){
  212. $objWidth = $srcImageWidth;
  213. $objHeight = $srcImageHeight;
  214. }
  215. if($objWidth < $objHeight)
  216. {
  217. $mu = $srcImageWidth / $objWidth;
  218. $objHeight = ceil($srcImageHeight / $mu);
  219. }
  220. else
  221. {
  222. $mu = $srcImageHeight / $objHeight;
  223. $objWidth = ceil($srcImageWidth / $mu);
  224. }
  225. MagickScaleImage($nmw, $objWidth, $objHeight);
  226. $ndw = NewDrawingWand();
  227. DrawComposite($ndw, MW_AddCompositeOp, 0, 0, $objWidth, $objHeight, $nmw);
  228. $res = NewMagickWand();
  229. MagickNewImage($res, $objWidth, $objHeight) ;
  230. MagickDrawImage($res, $ndw);
  231. MagickSetImageFormat($res, MagickGetImageFormat($nmw));
  232. return $res;
  233. }
  234. /************************************************
  235. /*
  236. savefile ??????????????
  237. ????
  238. $src_image_type ?????
  239. $src_image ???MagickWand resource
  240. ********************************************************/
  241. function savefile($src_image_type,$src_image)
  242. {
  243. if ($this->save_file)
  244. {
  245. MagickWriteImage($src_image, $this->save_file);
  246. }
  247. else
  248. {
  249. switch ($src_image_type){
  250. case 1:
  251. header("Content-type: image/gif");
  252. MagickEchoImageBlob($src_image);
  253. break;
  254. case 2:
  255. header("Content-type: image/jpeg");
  256. MagickEchoImageBlob($src_image);break;
  257. case 3:
  258. header("Content-type: image/png");
  259. MagickEchoImageBlob($src_image);break;
  260. default:
  261. header("Content-type: image/jpeg");
  262. MagickEchoImageBlob($src_image);break;
  263. }
  264. }
  265. }
  266. /****************************************************************************************
  267. getPos ???????????????????id????????????????
  268. ????
  269. $sourcefile_width: ?????
  270. $sourcefile_height: ?????
  271. $pos: ????
  272. // 0 = middle
  273. // 1 = top left
  274. // 2 = top right
  275. // 3 = bottom right
  276. // 4 = bottom left
  277. // 5 = top middle
  278. // 6 = middle right
  279. // 7 = bottom middle
  280. // 8 = middle left
  281. $wm_image: ????ID
  282. *************************************************************************************/
  283. function getPos($sourcefile_width,$sourcefile_height,$pos,$wm_image=""){
  284. if ($wm_image){
  285. $insertfile_width = MagickGetImageWidth($wm_image);
  286. $insertfile_height = MagickGetImageHeight($wm_image);
  287. }
  288. switch ($pos){
  289. case 0:
  290. $dest_x = ( $sourcefile_width / 2 ) - ( $insertfile_width / 2 );
  291. $dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );
  292. break;
  293. case 1:
  294. $dest_x = 0;
  295. if ($this->wm_text){
  296. $dest_y = $insertfile_height;
  297. }else{
  298. $dest_y = 0;
  299. }
  300. break;
  301. case 2:
  302. $dest_x = $sourcefile_width - $insertfile_width;
  303. if ($this->wm_text){
  304. $dest_y = $insertfile_height;
  305. }else{
  306. $dest_y = 0;
  307. }
  308. break;
  309. case 3:
  310. $dest_x = $sourcefile_width - $insertfile_width;
  311. $dest_y = $sourcefile_height - $insertfile_height;
  312. break;
  313. case 4:
  314. $dest_x = 0;
  315. $dest_y = $sourcefile_height - $insertfile_height;
  316. break;
  317. case 5:
  318. $dest_x = ( ( $sourcefile_width - $insertfile_width ) / 2 );
  319. if ($this->wm_text){
  320. $dest_y = $insertfile_height;
  321. }else{
  322. $dest_y = 0;
  323. }
  324. break;
  325. case 6:
  326. $dest_x = $sourcefile_width - $insertfile_width;
  327. $dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );
  328. break;
  329. case 7:
  330. $dest_x = ( ( $sourcefile_width - $insertfile_width ) / 2 );
  331. $dest_y = $sourcefile_height - $insertfile_height;
  332. break;
  333. case 8:
  334. $dest_x = 0;
  335. $dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );
  336. break;
  337. default:
  338. $dest_x = $sourcefile_width - $insertfile_width;
  339. $dest_y = $sourcefile_height - $insertfile_height;
  340. break;
  341. }
  342. return array("dest_x"=>$dest_x,"dest_y"=>$dest_y);
  343. }
  344. /*****************************
  345. * ??: getInfo($file)
  346. * ????????
  347. * ??: $file ????
  348. ********************************/
  349. function getInfo($file)
  350. {
  351. if(!file_exists($file)) return false;
  352. $data = getimagesize($file);
  353. $imageInfo["width"] = $data[0];
  354. $imageInfo["height"]= $data[1];
  355. $imageInfo["type"] = $data[2];
  356. $imageInfo["name"] = basename($file);
  357. return $imageInfo;
  358. }
  359. }
  360. ?>