doushe7934
2014-11-23 11:48 阅读 52
已采纳

使用ImageMagick和php在动画gif上添加文本

I try to adding text on animated gif with ImageMagick :

$source = public_path().'/test.gif';
$output = public_path().'/test2.gif';
$text = 'the cake is a lie';

// Create objects
$image = new Imagick($source);

// Create a new drawing palette
$draw = new ImagickDraw();

// Set font properties
$draw->setFont(public_path().'/fonts/Impact.ttf');
$draw->setFontSize(20);
$draw->setFillColor('black');

// Position text at the bottom-right of the image
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// Draw text on the image
$image->annotateImage($draw, 10, 12, 0, $text);

// Draw text again slightly offset with a different color
$draw->setFillColor('white');
$image->annotateImage($draw, 11, 11, 0, $text);

// Set output image format
$image->setImageFormat('gif');

$image->writeImage($output);

But with this code the image is no longer animated and the quality is very bad, any idea ?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • 已采纳
    doupin8555 doupin8555 2014-11-24 09:42

    Finally found :

    exec('/usr/local/bin/convert '.$source_img.' -font '.$font_location.' -pointsize 14 -draw "gravity south fill black text 0,12 \'some text\' fill white text 1,11 \'some text\' " '.$output_img);
    
    点赞 评论 复制链接分享
  • duan35557593 duan35557593 2014-11-23 13:24

    You probably want to use the -coalesce method to remove all optimisations from your GIF frames, then label it and then re-animate it with -layers Optimize, because otherwise the various optimisations (to the palette and inter-frame differences) interfere with, and reduce the quality of, your labelling.

    So, at the command-line, the process is like this:

    convert animation.gif -coalesce \
          -gravity SouthEast -background white ... <do label here>
          -layers Optimize output.gif
    

    Reference: See ImageMagick documentation here

    I don't tend to use PHP, but there appear to be methods matching the above functionality:

    Imagick Imagick::coalesceImages ( void )
    

    documentation

    bool Imagick::optimizeImageLayers ( void )
    

    documentation

    点赞 评论 复制链接分享

相关推荐