PHP IMAGEMAGICK MAGICKWAND 使用

来源:互联网 发布:java gzip 压缩文件 编辑:程序博客网 时间:2024/06/05 18:20
在php中,虽然使用GD库可以进行比较强大的图形处理。但是使用 ImageMagick的PHP扩展MagickWand同样能够实现强大的处理功能。当然,使用MagickWand需要在php中增加一个extension。具体怎么添加大家google吧。

这边转载几个使用MagickWand的例子。

来源:http://www.ioncannon.net/php/61/php-imagemagick-magickwand-examples/

Example 1: Simple Annotate
view plaincopy to clipboardprint?
  1. <?php  
  2.   
  3. // convert flower.jpg -font courier -fill white -pointsize 20 -annotate +50+50 Flower flower_annotate1.jpg  
  4.   
  5. $resource = NewMagickWand();  
  6. $dwand = NewDrawingWand();  
  7. $pwand = NewPixelWand();  
  8.   
  9. PixelSetColor($pwand"white");  
  10. DrawSetFont($dwand"/usr/share/fonts/default/TrueType/cour.ttf");  
  11. DrawSetFontSize($dwand, 20);  
  12. DrawSetFillColor($dwand$pwand);  
  13.   
  14. MagickReadImage( $resource'small_flower.jpg' );  
  15.   
  16. if( MagickAnnotateImage( $resource$dwand, 0, 0, 0, "Flower" ) )  
  17. {  
  18.   header( 'Content-Type: image/gif' );  
  19.   MagickEchoImageBlob( $resource );  
  20. }  
  21. else  
  22. {  
  23.   echo MagickGetExceptionString($resource);  
  24. }  
  25.   
  26. ?>  
One note on the above is that I needed to specify the exact location of the font to get it to show up. I believe this isn't always needed but if you try to leave it out and nothing shows up you should try specifying the full path to the font.

Example 2: Complex Annotate
view plaincopy to clipboardprint?
  1. <?php  
  2.   
  3. // convert flower.jpg -fill white -box "#00770080" -gravity South -pointsize 20 -annotate +0+5 "   Flower  " flower_annotate2.jpg  
  4.   
  5. $resource = NewMagickWand();  
  6. $dwand = NewDrawingWand();  
  7. $pwand = NewPixelWand();  
  8.   
  9. PixelSetColor($pwand"white");  
  10. DrawSetFont($dwand"/usr/share/fonts/default/TrueType/cour.ttf");  
  11. DrawSetFontSize($dwand, 20);  
  12. DrawSetFillColor($dwand$pwand);  
  13.   
  14. DrawSetGravity($dwand, MW_SouthGravity);  
  15.   
  16. MagickReadImage( $resource'small_flower.jpg' );  
  17.   
  18. if( MagickAnnotateImage( $resource$dwand, 0, 0, 0, "Flower" ) )  
  19. {  
  20.   header( 'Content-Type: image/gif' );  
  21.   MagickEchoImageBlob( $resource );  
  22. }  
  23. else  
  24. {  
  25.   echo MagickGetExceptionString($resource);  
  26. }  
  27.   
  28. ?>  
Example 3: Crop an Area
view plaincopy to clipboardprint?
  1. <?php  
  2.   
  3. // convert flower.jpg -crop 128×128+50+50 flower_crop.jpg  
  4.   
  5. $resource = NewMagickWand();  
  6.   
  7. MagickReadImage( $resource'small_flower.jpg' );  
  8.   
  9. if( MagickCropImage( $resource, 128, 128, 50, 50 ) )  
  10. {  
  11.   header( 'Content-Type: image/gif' );  
  12.   MagickEchoImageBlob( $resource );  
  13. }  
  14. else  
  15. {  
  16.   echo MagickGetExceptionString($resource);  
  17. }  
  18.   
  19. ?>  
Example 4: Rotate
view plaincopy to clipboardprint?
  1. <?php  
  2.   
  3. // convert flower.jpg -rotate 45 flower_rotate45.jpg  
  4.   
  5. $resource = NewMagickWand();  
  6. MagickReadImage( $resource'small_flower.jpg' );  
  7.   
  8. MagickRotateImage( $resource, null, 45 );  
  9.   
  10. header( 'Content-Type: image/gif' );  
  11. MagickEchoImageBlob( $resource );  
  12.   
  13. ?>  
Example 5: Resize
view plaincopy to clipboardprint?
  1. <?php  
  2.   
  3. // convert flower_original.jpg -resize 640×480 flower.jpg  
  4.   
  5. $resource = NewMagickWand();  
  6. MagickReadImage( $resource'small_flower.jpg' );  
  7.   
  8. MagickResizeImage( $resource, 100, 100, MW_QuadraticFilter, 1.0 );  
  9.   
  10. header( 'Content-Type: image/gif' );  
  11. MagickEchoImageBlob( $resource );  
  12.   
  13. ?>  
Example 6: Apply Resharp Filter
view plaincopy to clipboardprint?
  1. <?php  
  2.   
  3. // convert flower.jpg -unsharp 1.5×1.0+1.5+0.02 flower_unsharp.jpg  
  4.   
  5. $resource = NewMagickWand();  
  6. MagickReadImage( $resource'small_flower.jpg' );  
  7.   
  8. MagickUnsharpMaskImage( $resource, 1.5, 1.0, 1.5, 0.02 );  
  9.   
  10. header( 'Content-Type: image/gif' );  
  11. MagickEchoImageBlob( $resource );  
  12.   
  13. ?>  
Example 7: Compress JPG
view plaincopy to clipboardprint?
  1. <?php  
  2.   
  3. // convert flower.jpg -quality 80% flower_quality.jpg  
  4.   
  5. $resource = NewMagickWand();  
  6. MagickReadImage( $resource'small_flower.jpg' );  
  7.   
  8. MagickSetFormat($resource'JPG');  
  9. MagickSetImageCompression($resource, MW_JPEGCompression);  
  10. MagickSetImageCompressionQuality($resource, 80.0);  
  11.   
  12. header( 'Content-Type: image/gif' );  
  13. MagickEchoImageBlob( $resource );  
  14.   
  15. ?>  
下面是一个图片处理类。可以处理动态的多帧的gif图片。
view plaincopy to clipboardprint?
  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.     
  12. class Myclass_Magick    
  13. {    
  14. function Myclass_Magick() {    
  15.         if( !function_exists('newmagickwand') ) {    
  16.                 die('no MagickImage extends! ');    
  17.         }    
  18. }            
  19.     
  20. /**  
  21.  * 生成动态GIF  
  22.  *  
  23.  * @param array  $fileName: 目标文件地址  
  24.  * @param int    $delay:    GIF帧过渡时间  
  25.  * @param string $desName:  生成后的图像文件名  
  26.  *  
  27.  */    
  28.  function createGif($fileName$delay=1, $desName='') {    
  29.          $desName = $this->getDesName($desName);    
  30.         $mw = NewMagickWand();    
  31.         for($i=0; $i<count ($fileName);$i++){  
  32.           $mwTemp=NewMagickWand();     
  33.           MagickReadImage($mwTemp,$fileName[$i]);  
  34.           MagickSetImageDelay($mwTemp,$delay*100); //100="1秒"  
  35.           MagickAddImage($mw,$mwTemp);   
  36.           DestroyMagickWand($mwTemp);   
  37.         }   
  38.         MagickSetFormat($mw,"gif");   
  39.         MagickWriteImages($mw,$desName,MagickTrue);   
  40.         $mw=DestroyMagickWand($mw);   
  41.         return $desName;   
  42.  }   
  43.           
  44. /** 
  45.  * 缩放 动态GIF 
  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 ) { $desName="$this-">getDesName($desName);    
  53.         $mw = NewMagickWand();    
  54.         MagickReadImage($mw,$fileName);    
  55.         MagickResetIterator($mw);    
  56.         //MagickNextImage($mw);    
  57.         do {    
  58.                 $iw = MagickGetImageWidth($mw);    
  59.                 $ih = MagickGetImageHeight($mw);    
  60.                 $ratio = doubleval($iw) / doubleval($width);    
  61.                 if ($height * $ratio < $ih) {    
  62.                         $ratio = doubleval($ih) / doubleval($height);    
  63.                 }    
  64.                 $arrSize = arrayfloor($iw/$ratio), floor($ih/$ratio));    
  65.                 MagickResizeImage($mw$arrSize[0], $arrSize[1], 1, 1);    
  66.         } while(MagickNextImage($mw));    
  67.         MagickSetFormat($mw,"gif");    
  68.         MagickWriteImages($mw$desName, true);    
  69.         DestroyMagickWand($mw);    
  70.         return $desName;    
  71. }    
  72.     
  73. /**  
  74.  * 向 动画GIF上写字  
  75.  *  
  76.  * @param string $fileName: 目标文件地址  
  77.  * @param string $text:     要写的文字  
  78.  * @param string $desName:  生成后的图像地址  
  79.  * @param array  $height:        文字的样式  
  80.  *  
  81.  */    
  82. function writeGif($fileName$text$desName=''$config='') {    
  83.          $desName = $this->getDesName($desName);    
  84.         $textAlign = array// 对齐方式    
  85.                 0 => MW_ForgetGravity,    
  86.                 1 => MW_NorthWestGravity,    
  87.                 2 => MW_NorthGravity,    
  88.                 3 => MW_NorthEastGravity,    
  89.                 4 => MW_WestGravity,    
  90.                 5 => MW_CenterGravity,    
  91.                 6 => MW_EastGravity,    
  92.                 7 => MW_SouthWestGravity,    
  93.                 8 => MW_SouthGravity,    
  94.                 9 => MW_SouthEastGravity,    
  95.                 10 => MW_StaticGravity,    
  96.         );    
  97.         $textColor = "#FF0000";                                        // 字体颜色    
  98.         $textWidth = 120;                                                // 字体宽度    
  99.         $textSize  = 14;                                                // 字体大小    
  100.         $textFont = "simhei.ttf";    
  101.         $textAlpha = 1;    
  102.         $textAlignIndex = 1;    
  103.         $textString = iconv("gb2312""utf-8"$text);//如果你传入的是非UTF8中文,这里要转换    
  104.         $textName = $this->desName;    
  105.         if($config) {    
  106.                 extract($config, EXTR_OVERWRITE);    
  107.         }    
  108.         $dwFont = NewDrawingWand();    
  109.         $fontColor = NewPixelWand($textColor);    
  110.         DrawSetTextEncoding($dwFont"UTF-8");                //设定图像上文字的编码    
  111.         DrawSetFont($dwFont$textFont);                        //设定字体    
  112.         DrawSetFontWeight($dwFont$textWidth);                //设定字宽    
  113.         DrawSetFillColor($dwFont$fontColor);                //设定颜色    
  114.         DrawSetFontSize($dwFont$textSize);                //设定字体大小    
  115.         DrawSetGravity($dwFont$textAlignIndex);        //设定对齐方式    
  116.         DrawSetFillAlpha($dwFont$textAlpha);                //设置不透明度,1为完全不透明    
  117.     
  118.         $dwGif = NewMagickWand();    
  119.         MagickReadImage($dwGif$fileName);    
  120.         MagickResetIterator($dwGif);    
  121.         do {    
  122.                 MagickAnnotateImage( $dwGif$dwFont, 1, 1, 0, $textString );    
  123.         } while(MagickNextImage($dwGif));    
  124.         MagickSetFormat($dwGif,"gif");    
  125.         MagickWriteImages($dwGif$desName, true);    
  126.         DestroyDrawingWand($dwFont);    
  127.         DestroyMagickWand($dwGif);    
  128.         return $desName;    
  129. }    
  130.     
  131. /**  
  132.  * 向图像上写文字  
  133.  *  
  134.  * @param array  $fileName: 目标文件地址  
  135.  * @param string $desName:  生成后的图像地址  
  136.  * @param array  $fontInfo1:文字的样式信息  
  137.  * @param array  $fontInfo2:文字的样式信息  
  138.  * @param int    $delay:    GIF帧过渡时间  
  139.  *  
  140.  */    
  141.  function writeText2($fileName$desName=''$fontInfo1=''$fontInfo2=''$delay=1) {    
  142.          $desName = './temp/' . $this->getDesName($desName);    
  143.         $f1 = $this->writeText($fileName$fontInfo1);    
  144.         $f2 = $this->writeText($fileName$fontInfo2);    
  145.         // 再生成GIF    
  146.         $mwGif = NewMagickWand();    
  147.         $mw1 = NewMagickWand();    
  148.         $mw2 = NewMagickWand();    
  149.         MagickReadImage($mw1$f1);    
  150.         MagickReadImage($mw2$f2);    
  151.         MagickSetImageDelay($mw1,$delay*100);    
  152.         MagickAddImage($mwGif$mw1);    
  153.         MagickSetImageDelay($mw2,$delay*100);    
  154.         MagickAddImage($mwGif$mw2);    
  155.         DestroyMagickWand($mw1);    
  156.         DestroyMagickWand($mw2);    
  157.         MagickSetFormat($mwGif"gif");    
  158.         MagickWriteImages($mwGif$desName, MagickTrue);    
  159.         DestroyMagickWand($mwGif);    
  160.         unlink($f1);    
  161.         unlink($f2);    
  162.         return $desName;    
  163. }    
  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.     
  218.         $mw = NewMagickWand();    
  219.         MagickReadImage($mw$fileName);    
  220.         MagickAnnotateImage($mw$dwFont$textX$textY, 0, $textString );    
  221.         $tempName = './temp/' . time() . rand(0,1000) . ".jpg";    
  222.         MagickSetFormat($mw"jpg");    
  223.         MagickWriteImage($mw$tempName);    
  224.         DestroyDrawingWand($dwFont);    
  225.         DestroyMagickWand($mw);    
  226.         return $tempName;    
  227. }    
  228.     
  229. function getDesName($desName) {    
  230.          if( emptyempty($desName) ) {    
  231.                 $desName = md5(time().rand(0,100)).'.gif';    
  232.         }    
  233.         else {    
  234.                 ifstripos(strtolower($desName), '.gif') === false ) {    
  235.                         $desName .= ".gif";    
  236.                 }    
  237.         }    
  238.         return $desName;    
  239. }    
  240. }    
  241. ?> 
原创粉丝点击