3

我正在学习和练习我的 Imagick 技能。

我对使用 Imagick 笔画的轮廓文本有疑问。我想在这张图片上实现一个可见的效果:一个流行的互联网模因:

在此处输入图像描述

这是我到目前为止的代码:

$draw = new \ImagickDraw();
$outputImage = new \Imagick('meme.jpg');

$draw->setFillColor('#fff');
$draw->setFont('impact.ttf');
$draw->setFontSize(40);
$draw->setGravity(\Imagick::GRAVITY_NORTH);
$draw->setStrokeColor('#000');
$draw->setStrokeWidth(1);
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);

$outputImage->annotateImage($draw, 0, 5, 0, 'Sample text');

$outputImage->setFormat('png');
$outputImage->writeimage('tmp/meme.png');

问题:文字笔画看起来不太好。我在 Imagick 讨论板上找到了关于第二次注释图像的提示,但没有中风。不工作。

写图前:

   $draw->setStrokeColor('transparent');
   $outputImage->annotateImage($draw, 0, 5, 0, 'Sample text');

任何人都可以给我一个线索吗?

更新
总而言之,我生成的图像如下所示:

在此处输入图像描述

正如你所看到的,我在使用不同的字体大小时遇到​​了 2px 笔画的一些问题。在大字体上,它看起来不错,但对于较小的字体,笔画和字体会出现一些问题。

4

2 回答 2

4

版本1:调整大小

在此处输入图像描述

版本 2:合成过度和调整大小

在此处输入图像描述

版本 2 提供了更好的结果。请参阅下面的代码。根据最终大小,您需要调整字体和笔触大小,因为调整大小可能会产生不需要的效果。您也可以在不调整大小的情况下尝试版本 2。

版本 1:调整大小

$draw = new ImagickDraw();
$draw->setFillColor('#fff');
$draw->setFont('impact.ttf');
$draw->setFontSize(100); //use a large font-size
$draw->setStrokeColor('#000');
$draw->setStrokeWidth(4);
$draw->setStrokeAntialias(true);  //try with and without
$draw->setTextAntialias(true);  //try with and without
$outputImage = new Imagick();
$outputImage->newImage(1400,400, "transparent");  //transparent canvas
$outputImage->annotateImage($draw, 20, 100, 0, 'STOP ME FROM MEMEING');
$outputImage->trimImage(0); //Cut off transparent border
$outputImage->resizeImage(300,0, imagick::FILTER_CATROM, 0.9, false); //resize to final size
/*
Now you can compositve over the image
*/
//Clean up
$draw->clear();
$draw->destroy();
$outputImage->clear();
$outputImage->destroy();

版本 2:合成过度和调整大小

$draw = new ImagickDraw();
$draw->setFont('impact.ttf');
$draw->setFontSize(100); //use a large font-size
$draw->setStrokeAntialias(true);  //try with and without
$draw->setTextAntialias(true);  //try with and without

//Create text  
$draw->setFillColor('#fff');
$textOnly = new Imagick();
$textOnly->newImage(1400,400, "transparent");  /transparent canvas
$textOnly->annotateImage($draw, 21, 101, 0, 'STOP ME FROM MEMEING');  //parameters depend of stroke and text size
//Create stroke
$draw->setFillColor('#000'); //same as stroke color
$draw->setStrokeColor('#000');
$draw->setStrokeWidth(8);
$strokeImage = new Imagick();
$strokeImage->newImage(1400,400, "transparent");
$strokeImage->annotateImage($draw, 20, 100, 0, 'STOP ME FROM MEMEING');

//Composite text over stroke
$strokeImage->compositeImage($textOnly, imagick::COMPOSITE_OVER, 0, 0, Imagick::CHANNEL_ALPHA );
$strokeImage->trimImage(0);  //cut transparent border
$strokeImage->resizeImage(300,0, imagick::FILTER_CATROM, 0.9, false); //resize to final size
/*
Now you can compositve over the image
*/
//Clean up
$draw->clear();
$draw->destroy();
$strokeImage->clear();
$strokeImage->destroy();
$textOnly->clear();
$textOnly->destroy();
于 2012-12-13T11:09:37.263 回答
1

您可以发布您的结果或更具体地说明您认为不合适的内容吗?

一种解决方案可能是首先在透明背景上创建文本(带有笔划),然后将其合成到图像上。您可以创建更大字体大小的文本并调整大小以使其在最终图像上看起来更平滑。

于 2012-12-12T14:34:42.193 回答